繁体   English   中英

在iPhone 6+上旋转时,为什么导航栏从拆分视图中消失了?

[英]Why does my navigation bar disappear from my split view when I rotate on iPhone 6+?

问题

我的分割视图有问题。 在iPhone和iPad模拟器上可以正常工作,但是在iPhone 6+上,旋转设备后我丢失了导航栏。 这是6+模拟器上发生的情况:

  • 我启动该应用程序,它在导航栏中显示一个+按钮。 我点击这个按钮。
  • 它在现有视图上加载视图控制器。 如预期的那样,通过工作后退按钮可以看到导航栏。
  • 我水平转动设备。 按照预期,新控制器将显示在“主”部分中,右侧是一个空的详细信息部分。 不幸的是,导航栏消失了。
  • 当我垂直转动设备时,导航栏不会重新出现。

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

我的密码

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

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

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
    }
}

AddItemViewController

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
    }
}

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

我找到了答案。 我读了我最初错过的一篇文章,因为它专注于更改局部视图而不是主视图。 事实证明,如果我只管理细节,则分割视图会更好地工作,然后由主视图负责。 由于我从不希望更改细节,因此可以简单地将以下内容添加到拆分视图委托中:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM