有问题与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
将被推送到MasterViewController
的NavigationController
(案例iPhone 5)
在其他情况下, DetailViewController
将在其自己的NavigationController
,并且splitViewController
将使用其默认行为来处理displayMode或DeviceOrientation的所有转换。