2016-06-14 13 views
1

Ich habe eine ViewController-Klasse, die nur dazu dient, eine Warnmeldung mit einer benutzerdefinierten Nachricht und einem Titel anzuzeigen, der über eine benutzerdefinierte Initialisierungsnachricht übergeben wird. Dies geschieht, sobald die Ansicht in viewDidLoad angezeigt wird. Mein Problem ist jedoch, dass, wenn es um diese Ansicht geht, es auftaucht und für immer in dieser Ansicht feststeckt, anstatt nur den Blick auf den anderen zu richten. Ich bin mir nicht sicher, wie ich das beheben soll. Hier ist der Code für meine alertVC KlasseSwift UIAlertController mit benutzerdefinierter Nachricht

import UIKit 

class AlertVC: UIViewController { 

    var myMessage: String? 
    var myTitle: String? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 


    override func viewDidAppear(animated: Bool){ 
    let alertController = UIAlertController(title: myTitle, message: myMessage, preferredStyle: .Alert) 
    let OKAction = UIAlertAction(title: "OK", style: .Default) { 
     (action: UIAlertAction) in print("Youve pressed OK Button") 
    } 
    alertController.addAction(OKAction) 
    self.presentViewController(alertController, animated: true, completion: nil) 
    } 

    convenience init(title: String, message: String){ 
    self.init() 
    self.myTitle = title 
    self.myMessage = message 
    } 
} 

Dies ist der Code, wie erstelle ich ein Objekt für diese und versuchen, es zu zeigen.

let alert = AlertVC(title: "Error", message: "error") 
presentViewController(alert, animated: true, completion: nil) 

Jede Hilfe ist willkommen, hinterlassen Sie einen Kommentar, wenn Sie weitere Informationen benötigen. Vielen Dank!

+0

Wenn 'einzige Zweck des AlertVC' ist die' UIAlertController', warum Sie gerade die 'UIAlertController' auf Ihrem früheren' ViewController' präsentieren die nicht angezeigt werden? – Daven

+0

Ich habe versucht, eine Möglichkeit zu schaffen, die Warnmeldungsansicht in jeder Klasse zu verwenden, indem ich einen objektorientierten Weg dafür erstelle. Ich habe ungefähr 5 Klassen, die es vielleicht brauchen, aber ich würde eine abstrakte Art bevorzugen, Dinge zu tun, anstatt sie nur jedes Mal hart zu kodieren. – John511

+0

Sie rufen es in der 'viewdidappear()' Methode auf. Nennen Sie es in der 'viewdidload()'. – Dershowitz123

Antwort

11

Warum nicht einfach ein extension?

extension UIViewController { 

    func presentAlert(withTitle title: String, message : String) { 
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 
    let OKAction = UIAlertAction(title: "OK", style: .default) { action in 
     print("You've pressed OK Button") 
    } 
    alertController.addAction(OKAction) 
    self.present(alertController, animated: true, completion: nil) 
    } 
} 

und nennt es mit

presentAlert(withTitle: "Error", message: "error") 

in jeder UIViewController Klasse

+0

Spielt es eine Rolle, wo ich diese Erweiterung hinstelle? Wie sollte es unterhalb meiner AlertVC-Klasse gehen? Ich habe Erweiterungen nicht viel früher verwendet als @vadian – John511

+0

Sie können es überall auf der obersten Ebene einer Datei (außerhalb jeder anderen Klasse, struct, enum) setzen.Ich benutze Erweiterungen sehr viel in einer extra Datei 'Extensions' – vadian

+0

Funktioniert wie ein Charme! Danke!! – John511

1

Wenn AlertVC ‚s einziger Zweck die UIAlertController angezeigt ist, warum Sie nicht nur präsentieren die UIAlertController auf Ihrem früheren ViewController?

Also, wo Sie haben dies geschrieben:

let alert = AlertVC(title: "Error", message: "error") 
presentViewController(alert, animated: true, completion: nil) 

Ersetzen Sie es mit:

let alertController = UIAlertController(title: myTitle, message: myMessage, preferredStyle: .Alert) 
let OKAction = UIAlertAction(title: "OK", style: .Default) { 
    (action: UIAlertAction) in print("Youve pressed OK Button") 
} 
alertController.addAction(OKAction) 
self.presentViewController(alertController, animated: true, completion: nil) 

EDIT: Nachdem Sie Ihren Kommentar zu lesen, ich verstehe, dass Sie den gleichen Code mehrere Eingabe vermeiden wollen mal. Ich habe ein paar schnelle Recherchen gemacht und es scheint, dass Sie shouldn't subclass UIAlertController, also vielleicht eine Erweiterung nützlich sein könnte? Etwas wie:

extension UIAlertController{ 
    class func customAlertController(title : String, message : String) -> UIAlertController{ 
     let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) 
     let OKAction = UIAlertAction(title: "OK", style: .Default) { 
      (action: UIAlertAction) in print("Youve pressed OK Button") 
     } 
     alertController.addAction(OKAction) 
     return alertController 
    } 
} 

Dann ersetzen:

let alert = AlertVC(title: "Error", message: "error") 
presentViewController(alert, animated: true, completion: nil) 

mit:

let alert = UIAlertController.customAlertController("Error!", message: "error") 
    self.presentViewController(alert, animated: true) { 

    } 
+0

Danke, dass du mir hilfst zu verstehen, was mit dem passiert :) – John511

0

@ Vadian Antwort in Swift 3 mit Abschluss-Handler hinzugefügt Controller entlassen zu alarmieren.

extension UIViewController { 

    func presentAlertWithTitle(title: String, message : String, onDismiss: SimpleCompletionBlock? = nil) 
    { 
     let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) 

     let OKAction = UIAlertAction(title: "OK", style: .Default) { 
      (action: UIAlertAction) in print("Youve pressed OK Button") 

      onDismiss?() 
     } 

     alertController.addAction(OKAction) 
     self.presentViewController(alertController, animated: true, completion: nil) 
    } 
} 
Verwandte Themen