4

我有一个包含五个拆分视图控制器的选项卡式应用程序。

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

-[_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 的样板。我实际上并没有为弹出框编写故事板,也没有在 prepareforsegue 方法中使用它们,因为从理论上讲,spliltviewcontroller 将它们“免费”提供给我

所有五个 splitviewcontroller 都符合 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;
}

在上面,“人”的行为符合预期,但“场景”导致了崩溃。

我在任何视图中都看不到任何关于单击该 barbuttonitem 时发生的情况的任何内容,并且它没有出现在情节提要中。

想法?

4

3 回答 3

2

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

发生的事情是,在主视图的 viewWillAppear 中,我们在详细视图上设置了一些东西,这反过来又试图让主视图出现。把它拿出来,让每个视图控件本身就解决了这个问题。

于 2012-05-26T19:16:37.120 回答
1

这个错误有点神秘。当我不小心 [UIPopoverController presentPopoverFromBarButtonItem: permittedArrowDirections:]按顺序调用两次时,我遇到了同样的错误,第二次调用是在渲染/动画弹出框时。

于 2012-05-24T11:01:42.840 回答
0

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

于 2012-05-29T13:39:00.647 回答