2017-08-26 3 views
0

Ich bin auf der Suche nach einer benutzerdefinierten Unterklasse von UIAlertController erstellen. Wenn ich richtig verstehe, muss ich die super.init(title... irgendwo während der Initialisierung der Unterklassen aufrufen.Initialisierung einer Unterklasse von UIAlertController

Aber ich laufe weiter in Probleme mit bezeichneten Initialisierer. Ich habe die Dokumentation gelesen und kann nicht herausfinden, wie ich es zur Arbeit bringen kann. Hier ist mein Code (beachten Sie die Kommentare im Code):

class AccountInfoActionSheet: UIAlertController { 

    required init?(coder aDecoder: NSCoder) { //xcode says I need this 
     super.init(coder: aDecoder) //it also says I need to call a designated initializers so here it is 
     super.init(title: "Info", message: "Heres the Info", preferredStyle: .actionSheet) //but now I can't call this initializer 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

EDIT: Da UIAlertController nicht subclassed werden kann ich einfach eine Funktion erstellt, die die korrekt konfiguriert kehrt UIAlertController innerhalb des Viewcontroller, wo es gebraucht wird.

Antwort

1

Sie sollten keine Unterklasse UIAlertController.

prüfen Sie diesen Link:

https://developer.apple.com/documentation/uikit/uialertcontroller#//apple_ref/doc/uid/TP40014538-CH1-SW2

können Sie Methoden hinzufügen extensions verwenden, aber kann es nicht Unterklasse.

+0

können Sie, aber Sie sollten nicht. – Abizern

+0

@Abizern: ist es? Können Sie mir bitte sagen, wie oder wo kann ich die dazugehörige Dokumentation lesen? – Amit

+0

https://StackOverflow.com/a/45895316/41116 – Abizern

0

Wie limon's answer to another question sagt, sollten Sie keine Unterklasse UIAlertController.

Per Apple's documentation:

Die UIAlertController Klasse verwendet werden soll, wie sie ist und nicht Unterstützung Subklassifizieren. Die Ansichtshierarchie für diese Klasse ist privat und darf nicht geändert werden.

2

Wenn Sie eine einfachere Möglichkeit zum Erstellen allgemeiner Alert-Controller erstellen möchten, können Sie statt einer Unterklasse eine Erweiterung von UIAlertController erstellen, die über eine Factory-Methode verfügt, die den gewünschten konfigurierten Alert-Controller zurückgibt. Zum Beispiel:

extension UIAlertController { 

    static func accountInfo() -> UIAlertController { 
     // If you want to add Alert Actions you can add them to the controller before returning them. 
     return UIAlertController(title: "Info", message: "Here's the Info", preferredStyle: .actionSheet) 
    } 
} 

Und jetzt können Sie den Controller erstellen Sie einfach mit:

let ac = UIAlertController.accountInfo() 
0

Wie in anderen Antworten erwähnt wurde nicht UIAlertController Unterklasse sollen. Als Option können Sie eine Erweiterung mit einer Factory-Methode erstellen:

extension UIAlertController { 
    static func accountInfoActionSheet() -> UIAlertController { 
     return UIAlertController(title: "Title", message: "Message", preferredStyle: .actionSheet) 
    } 
} 

jedoch, andere Antworten sind nicht besonders truthful sagen, dass Sie nicht UIAlertController Unterklasse können. Sie sind nicht angenommen zu, aber Sie sehr viel können, wenn Sie wollen.

UIAlertController ist eine Unterklasse von UIViewController, daher haben sie den gleichen Initialisierer, der init(nibName: String?, bundle: Bundle?) ist.

Sie sollten es jedoch nicht in init?(coder aDecoder: NSCoder) aufrufen, weil es selbst ein Initialisierer ist. Es wird aufgerufen, wenn der Controller beispielsweise aus einem Storyboard initialisiert wird.

Hier ist das Beispiel, wie man das erreichen, was Sie wollen (obwohl Apple-genehmigen nicht, dass):

class AccountInfoActionSheet: UIAlertController { 

    // preferredStyle is a read-only property, so you have to override it 
    override var preferredStyle: UIAlertControllerStyle { 
     return .actionSheet 
    } 

    init() { 
     super.init(nibName: nil, bundle: nil) 
     initialize() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

    // all of the configuration code that init methods might share 
    // separated into a method for the sake of convenience 
    private func initialize() { 
     title = "Info" 
     message = "Heres the Info" 
     // any other setup needed 
    } 
} 
Verwandte Themen