当主视图控制器是UITabBarController时,自适应显示细节segue转换为模态而不是iPhone上的推送

pha*_*mel 16 iphone ios

在XCode 6中,如果您基于Master-Detail Application模板创建一个新项目,您将获得一个适用于所有设备的通用故事板.

在主视图中选择单元格时,将通过自适应"显示详细信息"segue更新详细视图.在iPhone 4,5,6或6+的纵向上,这个segue将按照预期的推动形式.在横向的iPad或iPhone 6+上,它将导致详细视图按预期更新.

现在,如果您将UITabBarController作为主视图控制器插入到原始主视图控制器的选项卡,则在主视图中选择单元格时发生的自适应segue在iPhone上的行为不正常.您现在可以获得模态转换,而不是进行推送转换.我该如何解决这个问题?奇怪的是,默认情况下不支持此功能.

我发现以下帖子很有用:UISplitviewController Master中的iOS8 TabbarController 但是当使用建议的方法时,当我在纵向推动后旋转到横向时,我在iPhone 6 Plus上没有得到正确的行为.详细视图的内容显示在主视图中,这并不奇怪,因为这是建议的解决方案所做的.

谢谢!

小智 6

重新观看来自WWDC14的视频我想我找到了一个更好的答案.

  1. 使用自定义UISplitViewController(子类)
  2. 覆盖showDetailViewController操作
  3. 使用traitCollection确定UISplitViewController的类
  4. 如果水平类是Compact,请让navigationController调用showViewController

这是自定义UISplitViewController的代码:

import UIKit

class CustomSplitViewController: UISplitViewController {

    override func showDetailViewController(vc: UIViewController!, sender: AnyObject!) {

        if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact) {
            if let tabBarController = self.viewControllers[0] as? UITabBarController {
                if let navigationController = tabBarController.selectedViewController as? UINavigationController {
                    navigationController.showViewController(vc, sender: sender)
                    return
                }
            }
        }

        super.showDetailViewController(vc, sender: sender)
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记在故事板中设置自定义类.

在iPhone 6,iPhone 6+和iPad Air的模拟器中测试并按预期工作.

  • @phamel你可以分享你在这种情况下必须做的代码修改吗? (2认同)