有问题与UISplitViewController

我创build了一个字典应用程序,我正在使用UISplitViewController来search和select一个单词,我的应用程序崩溃与此日志:

-[MeaningViewController topViewController]: unrecognized selector sent to instance 0x7f918945bef0

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MeaningViewController topViewController]: unrecognized selector sent to instance 0x7f918945bef0'

这里是我的代码:在ViewController (MasterView)

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [_searchbar resignFirstResponder]; if ([segue.identifier isEqualToString:@"Meaning"]) { //MeaningViewController *meaningVC = (MeaningViewController*)[[segue destinationViewController] topViewController]; UINavigationController *navController = (UINavigationController *)segue.destinationViewController; MeaningViewController *meaningVC = (MeaningViewController *)navController.topViewController; NSIndexPath*indexPath = _tableview.indexPathForSelectedRow; AppDelegate *appDelegateClass = (AppDelegate *)[[UIApplication sharedApplication] delegate]; Reader *selectedWord = [[appDelegateClass wordList] objectAtIndex:indexPath.row]; sqlite3 *database; NSString *mean = @""; if (sqlite3_open([appDelegateClass.currentDBPath cStringUsingEncoding:NSUTF8StringEncoding], &database) == SQLITE_OK) { NSString *sql =[NSString stringWithFormat:@"SELECT MEAN from DICM WHERE id = %ld",(long)selectedWord.oid]; sqlite3_stmt *compiledStatement; if(sqlite3_prepare_v2(database, [sql UTF8String] , -1, &compiledStatement, NULL) == SQLITE_OK) { while(sqlite3_step(compiledStatement) == SQLITE_ROW) { const char* f1 = (const char*)sqlite3_column_text(compiledStatement, 0); mean = f1 == NULL ? nil : [[NSString alloc] initWithUTF8String:f1]; }}} readerClass = (Reader *)[appClass.wordList objectAtIndex:indexPath.row]; [meaningVC setGetWord:readerClass.Name]; [meaningVC setGetMeaning:mean]; [meaningVC setGetOid:readerClass.oid]; dbClass=[[DB alloc]init]; [dbClass setViewTime:readerClass.oid]; NSLog(@"mean is %@",readerClass.Name); } } 

在这里输入图像说明

并在MeaningViewController (Detail)

  - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [_word setText:_getWord]; [_mean setText:_getMean]; oid = _getOid; } 

问题出现在这一行:

UINavigationController * navController =(UINavigationController *)segue.destinationViewController; MeaningViewController * meaningVC =(MeaningViewController *)navController.topViewController;

如果我用这个replace上面的行:

 MeaningViewController *meaningVC = (MeaningViewController*)segue.destinationViewController; 

它工作正常,但它并不能取代它的详细视图,只是把视图控制器在Master View上我怎样才能解决这个问题?

这里是AppDelegate代码:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; splitViewController.delegate = self; return YES; } - (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController { return YES; } 

我可以看到的一个问题是,您的DetailViewController没有embedded到它自己的UINavigationController 。 和你的故事板stream将如下所示:

 ->SplitVCont--UINavCont1--MasterVController--[O]--UINavCont2--DetailVController ->SplitVCont--UINavCont2--DetailViewController 

故事板

有了这个,在你的prepareForSegue ,segue.destinationViewController保证在所有的情况下(崩溃/拆分和所有的设备)一种UINavigationController类,或者你可以自省是安全的。

 [segue.destinationViewController isKindOfClass:[UINavigationController class]] 

在某些情况下, DetailViewController将被推送到MasterViewControllerNavigationController (案例iPhone 5)

在其他情况下, DetailViewController将在其自己的NavigationController ,并且splitViewController将使用其默认行为来处理displayMode或DeviceOrientation的所有转换。