SplitViewController在纵向视图(ipad)中崩溃

时间:2012-04-24 23:41:35

标签: ios ipad uisplitviewcontroller uipopovercontroller

我有一个标签式应用程序,其中包含五个splitviewcontrollers。

在纵向模式下,“主”按钮按预期显示,并且在前两个控制器上按钮的行为符合预期。但是,在最后三个选项卡上,该按钮会导致崩溃,并显示以下消息:

断言失败 - [_ UISlidingPopoverLayoutInfo _popoverViewSizeForContentSize:arrowDirection:],/ SourceCache / UIKit_Sim / UIKit-1914.84 / _UIPopoverLayoutInfo.m:160 2012-04-24 19:15:38.674 SMToolkit [12420:11303] * 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'未知方向传递给_popoverViewSizeForContentSize:arrowDirection:'

事实是,五个视图都是从同一个源上剪下来的,几乎是Apple的样板。我实际上并不是故事板的故事板,也不是我在准备方法中使用它们,因为spliltviewcontroller在理论上给了我'免费'

所有五个splitview控制器都符合UISplitViewControllerDelegate

appdelgate是这样的:

    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
   //Person
    UISplitViewController *personSplitViewController = [tabBarController.viewControllers objectAtIndex:1];
    UINavigationController *personNavigationController = [personSplitViewController.viewControllers lastObject];
    personSplitViewController.delegate = (id)personNavigationController.topViewController;
    UINavigationController *personMasterNavigationController = [personSplitViewController.viewControllers objectAtIndex:0];
    PersonMasterViewController *personController = (PersonMasterViewController *)personMasterNavigationController.topViewController;
    personController.managedObjectContext = self.managedObjectContext;
    //Scene
    UISplitViewController *sceneSplitViewController = [tabBarController.viewControllers objectAtIndex:2];
    UINavigationController *sceneNavigationController = [sceneSplitViewController.viewControllers lastObject];
    sceneSplitViewController.delegate = (id)sceneNavigationController.topViewController;
    UINavigationController *sceneMasterNavigationController = [sceneSplitViewController.viewControllers objectAtIndex:0];
    SceneMasterViewController *sceneController = (SceneMasterViewController *)sceneMasterNavigationController.topViewController;
    sceneController.managedObjectContext = self.managedObjectContext;

依此类推,替换tabBarController中的正确索引

然后在详细视图控制器中,每个都有以下(相同,我检查):

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = NSLocalizedString(@"Master", @"Master");
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}


- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.masterPopoverController = nil;
}

在上文中,'人'表现得如预期,但'场景'导致崩溃。

我没有在任何视图中看到任何关于点击该按钮项时会发生什么的事情,并且它没有出现在故事​​板中。

想法?

3 个答案:

答案 0 :(得分:2)

不幸的是,至少在我的情况下,答案是我们的代码中有一个非常愚蠢的错误。

发生的事情是,在viewWillAppear中,我们在主视图上设置了一些东西,而这些东西反过来试图让主视图出现。把它拿出来并使每个视图控制只能解决问题。

答案 1 :(得分:1)

错误有点神秘。当我不小心打电话时,我得到了同样的错误 <{1}}序列中两次,第二次调用是弹出窗口/动画的时候。

答案 2 :(得分:0)

只有当nil通过任何方法返回时才会出现断言失败错误。所以我想建议你为所有变量设置自我并检查nil ..