Wie fügen Sie UIViewController
Unterklassen in Swift benutzerdefinierte Initialisierer hinzu ?
Ich habe eine Unterklasse erstellt UIViewController
, die ungefähr so aussieht:
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
Wenn ich es ausführe, wird ein schwerwiegender Fehler angezeigt:
Schwerwiegender Fehler: Verwendung des nicht implementierten Initialisierers 'init (nibName: bundle :)' für die Klasse 'MyApp.MyViewController'
Ich habe an anderer Stelle gelesen, dass man beim Hinzufügen eines benutzerdefinierten Initialisierers auch überschreiben muss. init(coder aDecoder:NSCoder)
Lassen Sie uns das überschreiben init
und sehen, was passiert:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Wenn ich das hinzufüge, beschwert sich Xcode darüber self.leftVC is not initialized at super.init call
. Ich denke, das kann auch nicht die Lösung sein. Ich frage mich also, wie ich einer ViewController
Unterklasse in Swift benutzerdefinierte Initialisierer ordnungsgemäß hinzufügen kann (da dies in Objective-C kein Problem zu sein scheint).
quelle
MyViewController
?Antworten:
Ich habe es gelöst! Man muss den angegebenen Initialisierer aufrufen, der in diesem Fall der Init mit nibName ist, offensichtlich ...
quelle
Für einen allgemeineren UIViewController können Sie diesen ab Swift 2.0 verwenden
quelle
Sie sind sich nicht sicher, ob Sie es geschafft haben, dieses Problem vollständig zu lösen. Abhängig davon, wie die Benutzeroberfläche Ihrer Klasse aussehen soll und ob Sie die Codiererfunktionalität tatsächlich benötigen oder nicht, können Sie auch Folgendes verwenden:
Da
init:leftVC:rightVC:gap
es sich um einen festgelegten Initialisierer handelt, können Sie die Implementierungsanforderung erfüllen,init:coder
indem Sie ihn zu einem praktischen Initialisierer machen, der Ihren festgelegten Initialisierer aufruft.Das könnte besser sein als
Wenn Sie einige Eigenschaften initialisieren müssen, müssen Sie sie neu schreiben.
quelle
Swift 5
Wenn Sie einen benutzerdefinierten Initialisierer schreiben möchten, mit
UIViewController
dem initialisiert wirdstoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
Sie können einen benutzerdefinierten Initialisierer nur für
Optional
Eigenschaften schreiben .quelle