为什么我无法覆盖另一个UIViewController中UIViewController扩展的方法?

时间:2016-04-20 23:45:55

标签: ios uiviewcontroller uialertview uialertcontroller

我正在使用ios swift应用,我在我的应用中介绍了摇动手势的处理方式。除了一个面板,我想处理应用程序周围的摇晃。在这个特定的面板上,我想调用一个完全不同的功能。所以首先我写了一个UIViewController的扩展,以便在其他地方支持摇动手势:

extension UIViewController:MotionDelegate {

override public func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if motion == .MotionShake {
            print("I'm in extension")
            self.showAlertMessage("", message: "I'm in extension") //this invokes an alert message 
        }
}
}

然后在我想要处理它的面板中我写道:

override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if motion == .MotionShake {

        showAlertMsg("Yes!", message: "This is some random msg")
    }
}

现在问题如下:

当我在屏幕上摇动我希望表现不同的手机时 - 我会看到带有消息this is some random msg的警报消息。但是当屏幕上出现此屏幕(并且它会持续几秒钟)并再次摇动手机时 - 突然显示弹出窗口I'm in extension。我想避免显示第二个弹出窗口。问题是当前面有弹出的第一条消息时,它无法识别我的覆盖方法。在其他情况下(没有弹出窗口时)一切正常。这是我的showAlertMsg函数:

func showAlertMsg(title: String, message: String, delay: Double){


    let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
    self.presentViewController(alertController, animated: true, completion: nil)
    let delay = delay * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
        alertController.dismissViewControllerAnimated(true, completion: nil)
    })

}

有什么办法可以避免在从主控制器显示弹出窗口时显示弹出窗口吗?

1 个答案:

答案 0 :(得分:2)

因为您在面板中覆盖了UIViewController的扩展名。 然后你出现UIAlertController,它没有覆盖方法。 你可以做的是为UIAlertController做一个扩展并处理这个功能。