2016-04-20 8 views
0

Ich arbeite an einer ios swift App und ich führe die Handhabung von Shake-Gesten in meiner App ein. Ich möchte damit umgehen, dass ich neben einem Panel rund um die App herumschüttele. In diesem speziellen Panel möchte ich eine völlig andere Funktion aufrufen. Also zuerst habe ich eine Erweiterung UIViewController, so dass die Schüttelbewegung überall sonst unterstützt:Warum kann ich eine Methode von einer Erweiterung von UIViewController in einem anderen UIViewController nicht überschreiben?

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 
     } 
} 
} 

und dann in der Platte, die ich möchte es anders behandeln schrieb ich:

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

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

Jetzt ist das Problem ist wie folgt:

wenn ich das Telefon auf dem Bildschirm schütteln, die ich anders verhalten möchte - ich sehe die Alarmmeldung mit Nachricht this is some random msg. Aber wenn dieser Bildschirm auf dem Bildschirm erscheint (und es für ein paar Sekunden tut) und schüttele ich das Telefon wieder - plötzlich zeigt es das Popup I'm in extension. Ich möchte vermeiden, das 2. Popup zu zeigen. Das Problem ist, dass es meine überlagerte Methode nicht erkennt, wenn vorne ein Popup mit einer ersten Nachricht erscheint. In anderen Fällen (wenn kein Popup vorhanden ist) funktioniert alles einwandfrei. Das ist meine showAlertMsg Funktion:

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) 
    }) 

} 

Gibt es etwas, das ich das Popup von Erweiterung zu vermeiden tun konnte zeigt, während das Popup von der Hauptsteuerung angezeigt wird?

Antwort

2

Da Sie im Panel eine Erweiterung für UIViewController übersteuert haben. Dann präsentieren Sie UIAlertController, die Methode nicht überschrieben hat. Was Sie tun können, ist eine Erweiterung für UIAlertController zu machen und diese Funktion zu handhaben.

Verwandte Themen