2017-02-21 12 views
0

我运行到哪里我UINavigationController改变rootViewController并改变它回到我原来的UINavigationController,经过UISplitViewController开始同时显示它的主人和细节问题以紧凑/纵向的方式在手机设备中查看(不仅适用于加号手机,还适用于其他手机)。更改RootViewController的用于导航引起UISplitViewController上展示紧凑型纵向细节

体系结构的基本概述: A TabBarController包含几个选项卡。其中一个标签是UISplitViewController。我目前覆盖以下,以确保MasterViewController是在紧凑的方位图所示:

func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { 

    // this prevents phone from going straight to detail on showing the split view controller 
    return true 
} 

这工作得很好,并如预期显示在画像的主人。在任何时候按下另一个选项卡上的按钮可以创建一个新UINavigationController实例,并显示它,在我做了下面的rootViewController到新创建的UINavigationController改为显示:

let appDelegate = UIApplication.shared.delegate 
appDelegate?.window??.rootViewController = newNavVC 

在解雇,我只需通过上面相同的代码将UINavigationController更换回原来的那个。但是,一旦我这样做了一次(创建导航/显示/关闭),然后将标签切换回UISplitViewController,它会自行更改以显示并排主细部视图。我不知道这是可能的肖像模式的紧凑尺寸。我试图改变为UISplitViewController中4种首选显示模式中的任何一种,但这并没有解决它。

下面是它看起来像什么(iPhone 6模拟器),我错过代表或误解崩溃?

以前enter image description here

enter image description here

回答

1

,可随时更换,与在此链接中找到的代码片段分配RootViewController的逻辑:

Leaking views when changing rootViewController inside transitionWithView

Basical您只需为UIWindow类创建一个扩展,以正确设置根视图控制器。

extension UIWindow { 

/// Fix for https://stackoverflow.com/a/27153956/849645 
func set(rootViewController newRootViewController: UIViewController, withTransition transition: CATransition? = nil) { 

    let previousViewController = rootViewController 

    if let transition = transition { 
     // Add the transition 
     layer.add(transition, forKey: kCATransition) 
    } 

    rootViewController = newRootViewController 

    // Update status bar appearance using the new view controllers appearance - animate if needed 
    if UIView.areAnimationsEnabled { 
     UIView.animate(withDuration: CATransaction.animationDuration()) { 
      newRootViewController.setNeedsStatusBarAppearanceUpdate() 
     } 
    } else { 
     newRootViewController.setNeedsStatusBarAppearanceUpdate() 
    } 

    /// The presenting view controllers view doesn't get removed from the window as its currently transistioning and presenting a view controller 
    if let transitionViewClass = NSClassFromString("UITransitionView") { 
     for subview in subviews where subview.isKind(of: transitionViewClass) { 
      subview.removeFromSuperview() 
     } 
    } 
    if let previousViewController = previousViewController { 
     // Allow the view controller to be deallocated 
     previousViewController.dismiss(animated: false) { 
      // Remove the root view in case its still showing 
      previousViewController.view.removeFromSuperview() 
     } 
    } 
} 
+1

无需让我们知道您是谁或您发布的原因。 请在此处引用链接中的相关位以方便阅读。 – nloewen

+0

感谢您的提示!答复修改。 –

相关问题