我在 Xcode 6 中使用通用故事板,针对 iOS 7 及更高版本。我已经实现了一个UISplitViewController现在在运行 iOS 8 的 iPhone 上本机支持的功能,Xcode 会自动将其向后移植到 iOS 7。它工作得非常好,除非你在运行 iOS 8 的 iPhone 上以纵向启动应用程序,拆分视图的详细视图当我希望第一次看到主视图控制器时会显示控制器。我认为这是 iOS 8 的错误,因为当您在 iOS 7 上运行应用程序时,它会正确显示主视图控制器。但是 iOS 8 现在是通用的,而且这种情况仍在发生。如何设置它,以便当拆分视图控制器将被折叠时(屏幕上仅显示一个视图控制器),当显示拆分视图控制器时,它显示主视图控制器而不是细节?
UISplitViewController
我在 Interface Builder 中创建了这个拆分视图控制器。拆分视图控制器是标签栏控制器中的第一个视图控制器。master 和 detail VC 都是导航控制器,其中嵌入了 table view 控制器。
哦,伙计,这让我头疼了几天,不知道该怎么做。最糟糕的是,使用 master-detail 模板创建一个新的 Xcode iOS 项目工作得很好。幸运的是,最后,这个小事实是我找到解决方案的方式。
我发现一些帖子表明解决方案是primaryViewControllerForCollapsingSplitViewController:在UISplitViewControllerDelegate. 我试过没有用。Apple 在似乎有效的主从模板中所做的是实现新的(深吸一口气说所有这一切)splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:委托方法(再次上UISplitViewControllerDelegate)。根据文档,此方法:
primaryViewControllerForCollapsingSplitViewController:
UISplitViewControllerDelegate
splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:
要求代理调整主视图控制器并将辅助视图控制器合并到折叠界面中。
请务必阅读该方法的讨论部分以获取更多具体细节。
苹果处理这个问题的方式是:
- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController { if ([secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) { // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. return YES; } else { return NO; } }
这个实现基本上做了以下事情:
secondaryViewController
UINavigationController
DetailViewController
detailItem
Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
NO
纵向 iPhone 的结果如下(从纵向开始或旋转到纵向 - 或更准确地说是紧凑尺寸类):