1

我创建了一个字典应用程序,我使用UISplitViewController搜索和选择一个的话,我的应用程序崩溃与此日志:有问题与UISplitViewController

-[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); 
    } 
} 

enter image description here

和在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;

如果我这个替换上述行:

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; 
    } 
+1

segue的目标控制器已经是您的'MeaningViewController',而不是导航控制器。 – rmaddy

+0

@rmaddy这是什么意思:'MeaningViewController * meaningVC =(MeaningViewController *)[[segue destinationViewController] topViewController];'仍然崩溃! –

+0

你想要:'MeaningViewController * meaningVC =(MeaningViewController *)[segue destinationViewController];' – rmaddy

回答

0

一个问题,我可以看到的是,你的DetailViewController未嵌入自己的UINavigationController。和你的故事板的流动将是这样的:

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

->SplitVCont--UINavCont2--DetailViewController 

Storyboard

这种情况,在您的prepareForSegue的segue.destinationViewController是保证在所有情况下(折叠/分,并在所有设备)一类的UINavigationController的或者你可以自省以保证安全。

[segue.destinationViewController isKindOfClass:[UINavigationController class]] 

- 在某些情况下DetailViewController将被推到NavigationControllerMasterViewController(区分iPhone 5)

- 在其他情况下DetailViewController将在自己的NavigationControllersplitViewController将处理DISPLAYMODE的所有过渡或DeviceOrientation在您的情况下使用其默认行为。

+0

谢谢我只是为Detail View添加了另一个“Navigation Controller”,它现在不会崩溃,但仍然存在此问题:'ttp://i.imgur.com/ 8RH4frL.png' –

+0

欢迎您尝试使用iPhone5模拟器进行测试,看看您是否可以看到标准的主从细节行为..如果它不起作用,那么它将数据传递到细节并与splitView无关 – Idali

+0

我看到您的图像,所以检查你的委托:if([self.window.rootViewController isKindOfClass:[UISplitViewController class]]){UISplitViewController * splitViewController =(UISplitViewController *)self.window.rootViewController; splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; splitViewController.delegate = self; } – Idali