【发布时间】: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
}
}
如有任何建议,我将不胜感激。
【问题讨论】: