警告:尝试在已经呈现 ViewController 的 ViewController 上呈现 ViewController
Warning: Attempt to present ViewController on ViewController which is already presenting ViewController
我有一个视图控制器,其工具栏带有 3 个 UIButton,可将新的视图控制器作为弹出窗口打开。我在 Storyboard 中创建了转场并选择了 "Present as Popover"。弹出窗口有效,但是当用户在当前打开弹出窗口的情况下点击另一个按钮时,我收到此错误:
Warning: Attempt to present <Fingerpainter.OpacityViewController: 0x79095110> on <Fingerpainter.DrawingViewController: 0x7b278000> which is already presenting <Fingerpainter.BrushSizeViewController: 0x79573770>
有没有一种方法可以确保在打开新弹出窗口之前关闭所有弹出窗口?这是我在主要 ViewController(包含工具栏)中的 prepareForSegue 方法:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let identifier = segue.identifier ?? ""
let popoverPresentationController = segue.destinationViewController.popoverPresentationController
popoverPresentationController!.delegate = self
switch identifier {
case Storyboard.BrushSizeSegueIdentifier:
if let brushSizeViewController = popoverPresentationController?.presentedViewController as? BrushSizeViewController {
// set properties in brushSizeViewController
}
case Storyboard.OpacitySegueIdentifier:
if let opacityViewController = popoverPresentationController?.presentedViewController as? OpacityViewController {
//set properties in opacityViewController
}
case Storyboard.ColorSegueIdentity:
if let colorViewController = popoverPresentationController?.presentedViewController as? ColorViewController {
//set properties in colorViewController
}
default:
break
}
}
Is there a way to like make sure all popovers are closed before opening a new one
恰恰相反。 你 的工作是确保当弹出窗口存在时,召唤另一个弹出窗口的按钮不可点击。您可以通过禁用按钮来做到这一点,但更常见的是,为了协调按钮的禁用与弹出框的存在,这是通过调整弹出框呈现控制器的 passthroughViews
.
来完成的
不幸的是,存在一个长期存在的巨大错误,即使将 passthroughViews
设置为 nil
也无法阻止工具栏按钮的点击。解决方法是延迟执行此操作。我的 popover 代码 lot 添加了这样的东西:
if let pop = popoverPresentationController {
delay(0.1) {
pop.passthroughViews = nil
}
}
(此处描述 delay
:)。
我有一个视图控制器,其工具栏带有 3 个 UIButton,可将新的视图控制器作为弹出窗口打开。我在 Storyboard 中创建了转场并选择了 "Present as Popover"。弹出窗口有效,但是当用户在当前打开弹出窗口的情况下点击另一个按钮时,我收到此错误:
Warning: Attempt to present <Fingerpainter.OpacityViewController: 0x79095110> on <Fingerpainter.DrawingViewController: 0x7b278000> which is already presenting <Fingerpainter.BrushSizeViewController: 0x79573770>
有没有一种方法可以确保在打开新弹出窗口之前关闭所有弹出窗口?这是我在主要 ViewController(包含工具栏)中的 prepareForSegue 方法:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let identifier = segue.identifier ?? ""
let popoverPresentationController = segue.destinationViewController.popoverPresentationController
popoverPresentationController!.delegate = self
switch identifier {
case Storyboard.BrushSizeSegueIdentifier:
if let brushSizeViewController = popoverPresentationController?.presentedViewController as? BrushSizeViewController {
// set properties in brushSizeViewController
}
case Storyboard.OpacitySegueIdentifier:
if let opacityViewController = popoverPresentationController?.presentedViewController as? OpacityViewController {
//set properties in opacityViewController
}
case Storyboard.ColorSegueIdentity:
if let colorViewController = popoverPresentationController?.presentedViewController as? ColorViewController {
//set properties in colorViewController
}
default:
break
}
}
Is there a way to like make sure all popovers are closed before opening a new one
恰恰相反。 你 的工作是确保当弹出窗口存在时,召唤另一个弹出窗口的按钮不可点击。您可以通过禁用按钮来做到这一点,但更常见的是,为了协调按钮的禁用与弹出框的存在,这是通过调整弹出框呈现控制器的 passthroughViews
.
不幸的是,存在一个长期存在的巨大错误,即使将 passthroughViews
设置为 nil
也无法阻止工具栏按钮的点击。解决方法是延迟执行此操作。我的 popover 代码 lot 添加了这样的东西:
if let pop = popoverPresentationController {
delay(0.1) {
pop.passthroughViews = nil
}
}
(此处描述 delay
:)。