2016-05-04 6 views
-2

Meine iOS-App erfordert eine benutzerdefinierte Gruppe von Alerts mit ähnlicher Funktionalität. Kann ich diese in einer Klasse packen, damit ich nicht in jeden UIViewController einfügen muss?Wie packen benutzerdefinierte UIAlertController in einer Klasse (swift)?

func displayAlert(msg:String, handler: (UIAlertAction) -> Void){...} 
func successMsg (msg: String){...} 
func failMsg(msg: String){...} 

Ich habe versucht, sie in eine Unterklasse (AlertViewController) von UIViewController zu packen, aber dann gab es Laufzeitfehler: "Versuch < ... UIAlertController ...> auf < ... UIAlertController zu präsentieren .. .> deren Ansicht nicht in der Fensterhierarchie steht! "

Code in MyViewController:

@IBAction func leave() { 
    let date = getDate() 
    let datePresent = dateForPresent() 
    if stID == nil || name == nil { 
     return 
    } else { 
     alert.displayAlert("\(datePresent)"){action in 
      self.request.getResult(self.request.leavePara(self.stID!, date: date, name: self.name!)){ (result) in 
       dispatch_async(dispatch_get_main_queue(), { 
        let flag = result["result","out_Flag"].int 
        print(result) 
        let msg = result["result","out_nszRtn"].string! 
        if flag == 0 { 
         self.alert.successMsg(msg){ action in 
          self.performSegueWithIdentifier("personUnwind", sender: self) 
         } 
        }else { 
         self.alert.failMsg(msg) 
        } 
       }) 
      } 
     } 
    } 
} 
+1

So den Code zeigen, dass diese Warnung ausgelöst! – matt

+0

Eigentlich ist es egal, wie man das Warning repariert, man fragt nur, wie man so etwas normalerweise macht. –

Antwort

5

Bitte diesen Code verwenden.

func displayAlertWithMessage(title: String, message: string){ 
    let ac = UIAlertController(title: title, message: message, preferredStype: .Alert) 
    ac.addAction(UIAlertAction(title:"OK", style: .Default, handler: nil)) 
    let rootVC = UIApplication.sharedApplication().keyWindow?.rootViewController 
    rootVC?.presentViewController(ac, animated: true){} 
} 

Wenn Sie eine Warnung für einen bestimmten View-Controller anzeigen möchten, können Sie diese Funktion verwenden.

func displayAlertWithMessage(viewController: UIViewController, title: String, message: string){ 
    let ac = UIAlertController(title: title, message: message, preferredStype: .Alert) 
    ac.addAction(UIAlertAction(title:"OK", style: .Default, handler: nil)) 
    viewController.presentViewController(ac, animated: true){} 
} 

Und Sie können es Funktion mit diesem Code aufrufen.

displayAlertWithMessage(self, animated: true, completion: nil) 
+0

Das ist nah dran, was ich will, aber ich hatte gehofft, dass es auf einem bestimmten UIViewController (der gerade auf dem Bildschirm ist) anstelle des rootViewControllers vorhanden ist. Wie mache ich das? Der Code scheint ALert-Nachricht auf dem anfänglichen VC meiner App anzuzeigen, egal wer ihn aufruft. –

+0

@FateRiddle Hallo, ich habe meine Antwort bearbeiten. –

+0

Es funktioniert, danke Mann! Aus Neugier, was ruft 'UIApplication.sharedApplication(). KeyWindow? .rootViewController' Aufruf? –

1

Ich bin nicht sicher, was der Fehler Sie war waren immer, aber wenn Sie eine Unterklasse vermeiden möchten können Sie eine UIAlertViewController initializer implementieren, die ein Objekt an Ihre Bedürfnisse angepasst zurückgibt.

Zum Beispiel könnte folgende auf globaler Ebene geschrieben werden:

extension UIAlertController { 

    enum AlertMessageID { 
     case SaveFailed 
    } 

    convenience init(messageID: AlertMessageID) { 
     switch messageID { 
      case .SaveFailed: 
       self.init(title: "Oops", message: "The save failed.", preferredStyle: .Alert) 
     } 
     let okayButton = UIAlertAction(title: "Okay", style: .Default, handler: nil) 
     self.addAction(okayButton) 
    } 

} 
+0

Danke, das ist ein guter Weg, um das Problem zu lösen. Eine dumme Frage, wo soll ich diesen Code schreiben? –

+0

Dieser Code könnte irgendwo geschrieben werden, es muss nur auf globaler Ebene geschrieben werden. Aber Sie können es in jede Swift-Datei einfügen. –

Verwandte Themen