警告:尝试在已经呈现ViewController的ViewController上呈现ViewController

时间:2015-12-01 00:42:19

标签: swift uiviewcontroller ios9 swift2.1

我有一个带有3个UIButtons工具栏的视图控制器,可以打开一个新的视图控制器作为弹出窗口。我在故事板中创建了segues并选择了#34; Present as Popover"。弹出窗口工作但当用户在弹出窗口当前打开时点击另一个按钮时,我收到此错误:

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
    }

有没有办法确保在打开新的弹出窗口之前关闭所有弹出窗口?这是我在主ViewController(包含工具栏)中的prepareForSegue方法:

{{1}}

}

1 个答案:

答案 0 :(得分:0)

  

有没有办法确保在打开新的弹出窗口之前确定所有弹出窗口都已关闭

反过来说。这是你的工作,以确保在弹出窗口存在时,一个召唤另一个弹出窗口的按钮是不可点击的。您可以通过禁用按钮来执行此操作,但更常见的是,为了在弹出窗口存在的情况下协调禁用按钮,可以通过调整弹出窗口控制器的passthroughViews来完成。

不幸的是,有一个庞大且长期存在的错误,即使将passthroughViews设置为nil也不会阻止工具栏按钮被点击。解决方法是延迟执行。我的popover代码的 lot 添加了这样的东西:

if let pop = popoverPresentationController {
    delay(0.1) {
        pop.passthroughViews = nil
    }
}

(此处描述了delayhttps://stackoverflow.com/a/24318861/341994)。