iPhone 6 Plus 模拟器中带有旋转和拆分视图的竞争条件
race condition with rotation and split view in iPhone 6 Plus simulator
我有一个 master/detail 视图,iPhone 的底部有一个工具栏,iPad 的工具栏按钮移到了导航栏。这是我确定将它们放在哪里的代码:
private func isSplit() -> Bool {
if let svc = self.splitViewController {
return !svc.collapsed
}
else {
return false
}
}
func setActionLocation(notification: NSNotification) {
if self.isSplit() {
self.toolbarItems = nil
self.navigationItem.rightBarButtonItems = [self.actionButton, self.deleteButton]
self.navigationController?.setToolbarHidden(true, animated: false)
}
else {
self.toolbarItems = self.savedToolbar
self.navigationItem.rightBarButtonItem = nil
self.navigationController?.setToolbarHidden(false, animated: false)
}
}
对于 iPhone 6 Plus,它在横向拆分并在纵向折叠,所以我将其注册为设备方向更改时的通知:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "setActionLocation:", name: UIDeviceOrientationDidChangeNotification, object: nil)
这在大多数情况下都能正常工作。但是,在模拟器(XCode 6.3.2,iOS Simulator 8.3)中,如果我以纵向开始,单击以转到详细视图,然后快速(< 1 秒)旋转到横向,isSplit () 仍然 return false 并且工具栏最终出现在错误的位置。如果我再等一会儿再旋转它就可以正常工作了。
因为我没有 iPhone 6 Plus,所以我还不知道这是否发生在真实硬件中,或者它是否是模拟器的产物。假设它是真实的,有没有办法避免这种情况?
我找到了更好的处理方法,即删除轮换通知并在我的 UISplitViewControllerDelegate
中实施 func splitViewController(splitViewController: UISplitViewController, separateSecondaryViewControllerFromPrimaryViewController primaryViewController: UIViewController!) -> UIViewController?
。如果我还在看主视图,我需要创建一个细节视图控制器并告诉它把图标移到顶部。如果我已经在查看详细视图,我可以告诉该视图将图标移到顶部。旋转代码处理了第二种情况而不是第一种情况,因为旋转时细节视图控制器不存在,但拆分视图仍然折叠。
顺便说一句,这应该也更有可能与 iOS 9 分屏多任务一起使用。
我有一个 master/detail 视图,iPhone 的底部有一个工具栏,iPad 的工具栏按钮移到了导航栏。这是我确定将它们放在哪里的代码:
private func isSplit() -> Bool {
if let svc = self.splitViewController {
return !svc.collapsed
}
else {
return false
}
}
func setActionLocation(notification: NSNotification) {
if self.isSplit() {
self.toolbarItems = nil
self.navigationItem.rightBarButtonItems = [self.actionButton, self.deleteButton]
self.navigationController?.setToolbarHidden(true, animated: false)
}
else {
self.toolbarItems = self.savedToolbar
self.navigationItem.rightBarButtonItem = nil
self.navigationController?.setToolbarHidden(false, animated: false)
}
}
对于 iPhone 6 Plus,它在横向拆分并在纵向折叠,所以我将其注册为设备方向更改时的通知:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "setActionLocation:", name: UIDeviceOrientationDidChangeNotification, object: nil)
这在大多数情况下都能正常工作。但是,在模拟器(XCode 6.3.2,iOS Simulator 8.3)中,如果我以纵向开始,单击以转到详细视图,然后快速(< 1 秒)旋转到横向,isSplit () 仍然 return false 并且工具栏最终出现在错误的位置。如果我再等一会儿再旋转它就可以正常工作了。
因为我没有 iPhone 6 Plus,所以我还不知道这是否发生在真实硬件中,或者它是否是模拟器的产物。假设它是真实的,有没有办法避免这种情况?
我找到了更好的处理方法,即删除轮换通知并在我的 UISplitViewControllerDelegate
中实施 func splitViewController(splitViewController: UISplitViewController, separateSecondaryViewControllerFromPrimaryViewController primaryViewController: UIViewController!) -> UIViewController?
。如果我还在看主视图,我需要创建一个细节视图控制器并告诉它把图标移到顶部。如果我已经在查看详细视图,我可以告诉该视图将图标移到顶部。旋转代码处理了第二种情况而不是第一种情况,因为旋转时细节视图控制器不存在,但拆分视图仍然折叠。
顺便说一句,这应该也更有可能与 iOS 9 分屏多任务一起使用。