【发布时间】:2015-08-16 12:39:39
【问题描述】:
我正在为 iOS8 使用 UISplitViewController 实现一个通用应用程序,遇到 UINavigation 的奇怪问题,非常感谢您的专业知识。
我的项目具有以下 StoryBoard 布局:
在 iPad 上,一切正常。但是,在 iPhone 上运行时,导航无法按预期工作。请参阅此short video 演示当我从“详细屏幕 2”导航回“详细屏幕 1”时的导航问题。
我尝试在一个全新的项目中实现相同的场景,但没有发现问题。只有在移植到我现有的项目后,我才会看到这种行为。
更新 1:
这是我的 AppDelegate 代码:
@interface AppDelegate () <UISplitViewControllerDelegate>
@end
@implementation AppDelegate
-(BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions {
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
splitViewController.delegate = self;
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
return YES;
}
#pragma mark - Split view
- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
return YES;
}
....
@end
更新 2:
感谢 PetahChristian,我认为他在下面的观察是正确的:
折叠具有导航的辅助视图控制器 控制器,Apple 将辅助导航控制器插入到 主导航控制器的堆栈。所以,对于 iPhone,你在哪里 看到问题,看起来只有一个导航 控制器,但实际上有两个。
假设观察是正确的,如何防止辅助导航控制器推到主导航控制器上? UISplitViewControllerDelegate 方法仅处理直接链接到 UISplitViewController 的辅助视图控制器的折叠逻辑。在我的例子中,要折叠的辅助视图控制器(即 Detail VC1)是通过主视图控制器的“Show Detail (eg Replace)”segue 和 @ 987654328@ 方法在此转换期间未执行。
在全新项目中使用完全相同的设置,Apple 不会将辅助导航控制器插入主导航控制器,我在新项目中也没有遇到此问题。
非常感谢。
【问题讨论】:
-
我阅读了您更新的问题。辅助视图控制器实际上是辅助导航控制器。看看你的故事板。您可以看到辅助导航控制器,Detail VC1 作为其子级。当 splitView 折叠时,辅助导航控制器必须在主导航控制器上折叠。 Apple 确实将辅助导航控制器插入到主视图控制器中。这就是他们测试
[secondaryViewController isKindOfClass:[UINavigationController class]]...的原因,有关更多详细信息,请参阅我的答案。 -
谢谢 PetahChristain。我非常感谢你在这个主题上的帮助,你帮助我更多地了解了 UISplitViewControllerDelegate。我找到了问题的罪魁祸首,并在下面发布了我的答案。再次感谢。
标签: ios iphone uinavigationcontroller uinavigationbar uisplitviewcontroller