当我在UISplitViewController
中有多个详细信息视图时,我在iOS8中遇到问题,问题仅出在水平紧凑模式。
我的故事板看起来与此类似:
正如您所看到的,我的主人桌子有两种类型的单元格,每一种单元格连接到"它自己的"使用显示详细信息 segue的详细信息视图层次结构。因此,单击第一个单元格将在拆分视图的辅助区域中加载D1(及其根),单击第二个单元格将在那里加载D2。
在准备segue时,我将拆分视图的超级智能显示模式按钮添加到任何详细信息的导航项中:
controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
controller.navigationItem.leftItemsSupplementBackButton = YES;
除了一个案例外,一切都很完美:
performSegueWithIdentifier:@"showDetailD2"...
加载它。现在,一旦我这样做,我的魔术显示模式按钮显示"< D1"然后点击它就会回到D1!那完全不是我想要的行为。这种历史记录'当我在内部 D1或D2本身导航时,返回是可取的(我相信这个按钮足够智能)。但是当我处于最高级别时,我希望它能够打开主要区域。基本上我需要更多像左抽屉开启器(如在Android中)。
理由:我的D1表示某种错误/不完整状态(没有连接/没有用户/等)以及状态是否已经修复'那么正常的' UI通过D2或D3或任何其他方式加载。此时看到错误页面的后退按钮真的很奇怪。当我从D2到D3时,这个历史功能甚至是好的,所以如果有办法以某种方式从历史中删除D1 - 这也将有助于我。
在最坏的情况下,我会自己做按钮逻辑 - 我需要一种打开抽屉(主要区域)的方法,这些信息也会对我有帮助。
答案 0 :(得分:0)
所以,经过一段时间的努力,我找到了一种方法来获得我需要的东西。结果表明,在折叠模式下,分割视图“变成”只是一个简单的导航控制器。因此在D2之上有一个父导航控制器(也是一个导航控制器)。下面的代码写在D2的根控制器的viewDidLoad
中可以解决问题:
UINavigationController* parentNavi = self.navigationController.navigationController;
if (parentNavi != nil) {
// will get here only in collapsed mode
NSMutableArray *controllers = [NSMutableArray arrayWithArray:parentNavi.viewControllers];
NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
for (UIViewController *controller in controllers) {
if ([controller.title isEqualToString:@"D1"]) {
[set addIndex:[controllers indexOfObject:controller]];
}
}
[controllers removeObjectsAtIndexes:set];
parentNavi.viewControllers = controllers;
}
只有当您处于紧凑尺寸时,代码才会输入if
声明。清理控制器后,显示模式按钮指向主区域。这段代码也很灵活 - 你可以摆脱堆栈中不需要的任何页面。