在 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 消失的主要内容,如果未能解决你的问题,请参考以下文章
iPad拆分视图,uisplitview中的多个主视图和详细视图
在基于 UISplitView 的 iPad 应用程序底部添加工具栏