Entschuldigung, wenn dies schon einmal gefragt wurde, habe ich viel gesucht und viele Antworten stammen von früheren Swift-Betas, als die Dinge anders waren. Ich kann anscheinend keine endgültige Antwort finden.
Ich möchte eine Unterklasse haben UIViewController
und einen benutzerdefinierten Initialisierer haben, damit ich ihn einfach im Code einrichten kann. Ich habe Probleme damit in Swift.
Ich möchte eine init()
Funktion, mit der ich eine bestimmte Funktion übergeben kann, die NSURL
ich dann mit dem View Controller verwenden werde. In meinen Augen sieht es so aus init(withImageURL: NSURL)
. Wenn ich diese Funktion hinzufüge, werde ich aufgefordert, die init(coder: NSCoder)
Funktion hinzuzufügen .
Ich glaube, das liegt daran, dass es in der Oberklasse mit dem required
Schlüsselwort markiert ist . Also muss ich es in der Unterklasse machen? Ich füge es hinzu:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Was jetzt? Wird mein spezieller Initialisierer als convenience
Eins betrachtet? Ein ausgewiesener? Rufe ich einen Super-Initialisierer auf? Ein Initialisierer aus derselben Klasse?
Wie füge ich meinen speziellen Initialisierer einer UIViewController
Unterklasse hinzu?
quelle
Antworten:
quelle
ViewController()
,ViewController(imageURL: url)
oder es aus dem Storyboard zu laden.required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
sonstsuper.init(coder: aDecoder)
der Fehler von Propertyself.someProperty
beimsuper.init
Anruf nicht initialisiert wurdeinit(coder: aDecoder)
. DasfatalError
wird ausreichenFür diejenigen, die UI in Code schreiben
quelle
Dies ist den anderen Antworten sehr ähnlich, jedoch mit einigen Erklärungen. Die akzeptierte Antwort ist irreführend, da ihre Eigenschaft optional ist und nicht die Tatsache
init?(coder: NSCoder)
aufdeckt , dass Sie jede einzelne Eigenschaft initialisieren MÜSSEN und die einzige Lösung dafür darin besteht, eine zu habenfatalError()
. Letztendlich könnten Sie davonkommen, indem Sie Ihre Immobilien optional machen, aber das beantwortet die Frage des OP nicht wirklich.Sie müssen es im Grunde verlassen, um es vom Storyboard zu laden. Warum?
Denn wenn man einen Viewcontroller ruft
storyboard.instantiateViewController(withIdentifier: "viewController")
dann UIKit wird seine Sache und TelefonierenSie können diesen Aufruf niemals an eine andere init-Methode umleiten.
Für programmgesteuert erstellte viewController- oder nib-erstellte viewController können Sie diesen Aufruf jedoch wie oben gezeigt umleiten.
quelle
Sie sind hier dokumentiert .
quelle
Wenn Sie beispielsweise eine benutzerdefinierte Init für ein Popover benötigen, können Sie den folgenden Ansatz verwenden:
Erstellen Sie eine benutzerdefinierte Init, die die Super-Init mit nibName und Bundle verwendet, und greifen Sie anschließend auf die view-Eigenschaft zu, um das Laden der View-Hierarchie zu erzwingen.
Anschließend können Sie in der Funktion viewDidLoad die Ansichten mit den bei der Initialisierung übergebenen Parametern konfigurieren.
quelle