具有核心数据的Universal Master-Detail应用程序和用于iphone故事板的选项卡控制器获取无法识别的select器发送到实例错误

我在X-Code中开始了一个主从应用程序。 我select了通用的选项,核心数据和git回购。 当应用程序出现时,我进入了iphone故事板,添加了一个选项卡视图控制器,将其开始的nav / table / detail视图作为第三个选项卡移动到选项卡控制器中(实际上我希望它是第四)。 然后我select了tab控制器作为iphone模式下程序开始的初始视图。 它build立成功,但不允许程序完成加载。 出现的错误logging如下:

2013-05-11 21:35:00.302 FearlessAndThorough[6318:907] -[UITabBarController topViewController]: unrecognized selector sent to instance 0x1c592020 2013-05-11 21:35:00.306 FearlessAndThorough[6318:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITabBarController topViewController]: unrecognized selector sent to instance 0x1c592020' *** First throw call stack: (0x337f33e7 0x3b4ee963 0x337f6f31 0x337f564d 0x3374d208 0xc9e43 0x35662aa1 0x35662625 0x3565a833 0x35602d1f 0x356027ad 0x356021ef 0x3731a5f7 0x3731a227 0x337c83e7 0x337c838b 0x337c720f 0x3373a23d 0x3373a0c9 0x3565946d 0x356562b9 0xc9ab5 0x3b91bb20) libc++abi.dylib: terminate called throwing an exception (lldb) 

我希望有人以前这样做,可以给我一个小的见识,以适当的程序或步骤来设置一个标签视图控制器types的应用程序,然后将转换成iPad的主细节应用程序。

这是当前的应用程序委托的didFinishLaunchingWithOptions:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; splitViewController.delegate = (id)navigationController.topViewController; UINavigationController *masterNavigationController = splitViewController.viewControllers[0]; MasterViewController *controller = (MasterViewController *)masterNavigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; } else { UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; MasterViewController *controller = (MasterViewController *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; } return YES; } 

你的问题是你添加了一个标签栏控制器到你的iPhone故事板的前面,但是在你的“else”子句中,你说这个窗口的根视图控制器是一个导航控制器 – 不是,你添加的标签栏控制器是。 如果你在这个else子句中作为第二行login,你会看到navigationController实际上是一个标签栏控制器,而不是导航控制器。 其他条款需要像这样:

  UITabBarController *tbc = (UITabBarController *)self.window.rootViewController; UINavigationController *navigationController = tbc.viewControllers[3]; MasterViewController *controller = (MasterViewController *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; 

我不确定tbc.viewControllers中的“3”。 我无法从您的描述中知道导航控制器在哪个选项卡中,因此您可能需要更改该选项卡。

我想我有你的问题。

您是否在Xcode导航器中使用了UITabbar对象:

在这里输入图像说明

因为要用TabbarControllerpipe理视图,最好的方法是你的视图embedded到导航控制器中,如下所示:

在这里输入图像说明

然后,您将第一个视图embedded到导航控制器中:

在这里输入图像说明

您现在可以在该字段中添加一个新的viewController,并通过从TabbarController拖拽并将其添加到TabbarController中,并selectRelationship项:

在这里输入图像说明

然后你在navigationController中得到2个视图:

在这里输入图像说明

而在AppDelegate没有什么可做的。

然后为你想embedded到navigationController中的任何其他视图做最后一步。

希望这可以帮助。

 // Change your else part in appdelegate to this it may works. else { UITabBarController *tabBarController = (UITabBarController *) self.window.rootviewController; // For third view in tabbar controller UINavigationController *navigationController = [tabBarController viewControllers] objectAtIndex: 2]; navigationController = (UINavigationController *)self.window.rootViewController; MasterViewController *controller = (MasterViewController *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; }