在 UISplitView 中选择导航后,DetailView 消失

Posted

技术标签:

【中文标题】在 UISplitView 中选择导航后,DetailView 消失【英文标题】:DetailView Disappears After Selecting Navigation Inside UISplitView 【发布时间】:2013-03-30 09:26:32 【问题描述】:

我在项目中遇到了一个小问题。我有一个简单的 iPad 应用程序,它在横向方向使用 SplitView。 MasterViewController 是 tableview 而 DetailView 是 WebView 如下所示:

上图结果如下:

在那之后,我把整个东西放在了 ECSlidingViewController 里面。点击 MasterViewController 中的“菜单”按钮将显示如下所示的侧边菜单:

现在我可以点击菜单中的其他选项,假设我在菜单中点击了“联系人”,关联的视图控制器将如下所示:(此视图控制器没有任何详细视图)

到目前为止一切都很好,正是我想要的!!!! 当我再次点击菜单按钮以显示菜单并再次选择“导航”以显示表视图。点击“导航”时,显示MasterView,隐藏DetailView,如下图:

除此之外,点击上面表格中的任何条目都会导致程序崩溃,并在控制台中显示以下消息:

* -[UIStoryboardReplaceSegue perform] 中的断言失败,/SourceCache/UIKit_Sim/UIKit-2380.17/UIStoryboardBuiltInSegues.m:63 2013-03-30 13:59:58.179 19iPadiPad[5806:c07] * 终止应用程序到期 未捕获的异常“NSInternalInconsistencyException”,原因: '找不到拆分视图控制器的祖先 '',在执行拆分视图时 控制器用目的地替换segue(标识符'pushLink') ''' *** 第一次抛出调用堆栈:(0x217b012 0x16bce7e 0x217ae78 0x1152665 0xa57349 0xa48b99 0xa48c14 0x6b0249 0x6b04ed 0x10ba5b3 0x213a376 0x2139e06 0x2121a82 0x2120f44 0x2120e1b 0x1d587e3 0x1d58668 0x600ffc 0x24bd 0x23e5) libc++abi.dylib: 终止调用抛出异常

有人可以调查问题并告诉问题可能出在哪里。提前致谢。

更新:

在与聊天中的用户交谈后,他建议在我点击菜单中的导航后,接下来出现的只是主视图,而拆分视图实际上没有加载。看起来这是问题,但我不知道如何解决。

更新:

ECSlidingView 如何与 SplitView 集成

在收到一条询问 ECSlidingView 如何连接到项目和 SplitView 的评论后,我正在更新问题。

我创建了一个继承自 UISplitViewController 的名为“MainSplitViewController”的类,并将其与身份检查器中故事板中的 splitView 连接起来。我也给了它“SplitTop”的故事板ID。

然后在我的 InitialViewController 中,我将 SplitView 称为 topviewcontroller,如下所示:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"SplitTop"];

    

如上图所示,当按下 MasterViewController 上的“菜单”按钮时,会出现 ECSlidingView 菜单。该菜单按钮正在使用 IBAction 来显示 ECSlidingView:

- (IBAction)revealMenu:(id)sender 

    [self.slidingViewController anchorTopViewTo:ECRight];


【问题讨论】:

您正在丢失拆分视图。问题在于与ECSlidingView 的连接。准确告诉我们您是如何管理整个视图层次结构的,然后答案应该相对明显。我怀疑您只是将主视图链接到 ECSlidingView。 我更新了ECSlidingView如何连接到整个项目的问题。请看一下 【参考方案1】:

我还在我正在进行的测试项目中使用了 ECSlidingViewController。我想我能够理解你遇到的问题。

首先,这个问题与 SplitView 或其中的导航控制器没有任何关系,因为您可以删除 SplitView,它会正常工作。这个问题与您在 ECSlidingView 库中集成 SplitViewController 的方式完全相关。

查看您上面发布的图像后,似乎 ECSlidingViewController 在您开始使用 SplitView 之前已添加到项目中。这意味着在您的代码中,导航菜单仍然连接到您的 MasterViewController。它应该连接到 SplitViewController。

正如您更新的问题所暗示的那样,您在 InitialView 中调用您的 SplitView,如下所示:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"SplitTop"];

    

但上面的代码只是将它设置为 TopViewController。我检查了 ECSlidingView 库,您会注意到显示的菜单表视图由 MenuViewController 处理。这意味着您必须在此类中进行必要的更改。

由于 MainSplitViewController 类的 StoryBoard ID 设置为“SplitTop”,因此您可以将其添加到 MenuViewController 类的 ViewDidLoad 部分,其中定义了绘制菜单项的整个数组。

希望对您有所帮助。

【讨论】:

是的,我完全按照你说的做了,我的问题已经解决了。我不知道我怎么错过了这么一件小事。非常感谢。

以上是关于在 UISplitView 中选择导航后,DetailView 消失的主要内容,如果未能解决你的问题,请参考以下文章

保存核心数据对象后,UISplitView 详细信息未更新

iPad拆分视图,uisplitview中的多个主视图和详细视图

在基于 UISplitView 的 iPad 应用程序底部添加工具栏

创建后如何更改 ViewController 的类型?

如何在 UISplitView 的详细视图中清除 UIWebView 的内容

在视图出现之前调用 iOS viewDidAppear