为啥我在 iPhone 6+ 上旋转时导航栏会从拆分视图中消失?

Posted

技术标签:

【中文标题】为啥我在 iPhone 6+ 上旋转时导航栏会从拆分视图中消失?【英文标题】:Why does my navigation bar disappear from my split view when I rotate on iPhone 6+?为什么我在 iPhone 6+ 上旋转时导航栏会从拆分视图中消失? 【发布时间】:2015-09-13 21:45:59 【问题描述】:

问题

我的拆分视图有问题。它在 iPhone 和 iPad 模拟器上运行良好,但在 iPhone 6+ 上,我在旋转设备后丢失了导航栏。以下是 6+ 模拟器上发生的情况:

我启动应用程序,它会在导航栏中显示一个 + 按钮。我点按此按钮。 它在现有视图上加载视图控制器。正如预期的那样,导航栏通过一个工作后退按钮可见。 我水平转动设备。正如预期的那样,新控制器出现在 Master 部分,右侧有一个空的 detail 部分。不幸的是,导航栏消失了。 当我垂直转动设备时,导航栏不再出现。

事实上,当我水平转动设备时,导航控制器似乎已从堆栈中移除(我从输出 splitViewContoller.viewControllers 的内容中观察到了这一点)。

我的代码

测试应用程序只是经过一些修改的主从模板。

我添加了一个新的“添加项目”控制器,然后从主视图的“+”按钮创建了一个显示转场。 “添加项目”控制器是空白的,只有蓝色背景。

DetailViewController 有一个 timerStarted 布尔值,当使用详细视图时为 true,不使用时为 false。主视图在详细信息正在使用时隐藏,在不使用时显示。

这是相关代码(AppDelegate 中没有什么有趣的,因为它不再是拆分视图委托,并且 MasterViewController 没有交互,因为按钮通过故事板工作)

DetailViewController

import UIKit

class DetailViewController: UIViewController, UISplitViewControllerDelegate 
    @IBOutlet weak var detailDescriptionLabel: UILabel!
    var collapseDetailViewController = true


    var detailItem: AnyObject? 
        didSet 
            self.configureView()
        
    

    var timerStarted: Bool = false 
        didSet 
            self.changeTimerStatus()
        
    

    func configureView() 
        if let detail: AnyObject = self.detailItem 
            if let label = self.detailDescriptionLabel 
                label.text = detail.description
                self.timerStarted = true
            
        
    

    func changeTimerStatus() 
        if self.timerStarted 
            if splitViewController!.collapsed == false 
                UIView.animateWithDuration(0.3, animations: 
                    self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryHidden
                )
            
            collapseDetailViewController = false
         else 
            if splitViewController!.collapsed 
                self.splitViewController?.viewControllers[0].popToRootViewControllerAnimated(true)
             else 
                UIView.animateWithDuration(0.3, animations: 
                    self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
                )
            
            collapseDetailViewController = true
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
        splitViewController?.delegate = self
        self.disabledScreen.hidden = false
        self.view.bringSubviewToFront(disabledScreen)
        self.configureView()
    

    override func viewWillAppear(animated: Bool) 
        if splitViewController!.collapsed == false && self.timerStarted == false 
            splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
        
    

    @IBAction func closeButton(sender: AnyObject) 
        self.timerStarted = false
    

    func primaryViewControllerForExpandingSplitViewController(splitViewController: UISplitViewController) -> UIViewController? 
        if timerStarted == true 
            splitViewController.preferredDisplayMode = UISplitViewControllerDisplayMode.PrimaryHidden
         else 
            splitViewController.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
        
        return nil
    

    func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController!, ontoPrimaryViewController primaryViewController: UIViewController!) -> Bool 
        return collapseDetailViewController
    

添加项目视图控制器

import UIKit

class AddItemViewController: UIViewController, UISplitViewControllerDelegate 
    var collapseDetailViewController = false

    override func viewDidLoad() 
        super.viewDidLoad()
        self.splitViewController?.delegate = self
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    override func viewDidAppear(animated: Bool) 
        self.splitViewController?.delegate = self
        self.collapseDetailViewController = false
    

    override func viewWillDisappear(animated: Bool) 
        self.splitViewController?.delegate = nil
        self.collapseDetailViewController = true
    

    func primaryViewControllerForExpandingSplitViewController(splitViewController: UISplitViewController) -> UIViewController? 
        return self
    

    func primaryViewControllerForCollapsingSplitViewController(splitViewController: UISplitViewController) -> UIViewController? 
        return nil
    

    func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController!, ontoPrimaryViewController primaryViewController: UIViewController!) -> Bool 
        return collapseDetailViewController
    

如有任何建议,我将不胜感激。

【问题讨论】:

【参考方案1】:

我找到了答案。我读了一篇我最初错过的文章,因为它侧重于更改详细视图而不是主视图。事实证明,如果我只管理细节,然后主人会照顾自己,拆分视图会更好。由于我从不想更改细节,我可以简单地将以下内容添加到我的拆分视图委托中:

func splitViewController(splitViewController: UISplitViewController, separateSecondaryViewControllerFromPrimaryViewController primaryViewController: UIViewController!) -> UIViewController? 
    return (UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("detailView") as! UIViewController)

完成此操作后,我不再丢失导航栏。

【讨论】:

以上是关于为啥我在 iPhone 6+ 上旋转时导航栏会从拆分视图中消失?的主要内容,如果未能解决你的问题,请参考以下文章

为啥导航栏会切断我的 UI Builder 的一部分,但在测试时没有切断它?

iphone导航栏不见了

导航栏消失时 UIStepper 不会向上移动

当我在 iPhone 的导航栏上单击返回时,如何弹出到所需的视图控制器

导航栏标题不在 iPhone 的纵向模式中居中

隐藏导航栏会导致其下方和上方的空间