Nie używam UIViewController
z storyboardu i chcę mieć niestandardową init
funkcję, w której przekazuję NSManagedObjectID
jakiś obiekt. Chcę tylko zadzwonić, super.init()
tak jak w przypadku Objective-C. Lubię to:
init(objectId: NSManagedObjectID) {
super.init()
}
Ale pojawia się następujący błąd kompilatora:
Musi wywołać wyznaczony inicjator klasy UIViewController nadklasy
Czy mogę już tego po prostu nie robić?
źródło
initWithCoder:
pochodzi zNSCoding
protokołu ... Nadal nie mogę dowiedzieć się, jaka jest jego rola w inicjowaniu instancji UIViewController, czy jest to „wyznaczony” inicjator UIViewController, czy też dowolna z jego klas nadrzędnych. ,let
właściwości, jeżeli występuje:super.init(nibName: nil, bundle: nil)
.Innym fajnym rozwiązaniem jest zadeklarowanie nowego inicjatora jako
convenience
inicjatora w następujący sposób:convenience init( objectId : NSManagedObjectID ) { self.init() // ... store or user your objectId }
Jeśli w ogóle nie zadeklarujesz żadnych wyznaczonych inicjatorów w swojej podklasie, zostaną one odziedziczone automatycznie i możesz użyć ich
self.init()
w wygodnym inicjatorze.W przypadku UIViewController domyślna metoda init zadzwonić
init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
znil
obu argumentów (Command na UIViewController daje te informacje).TL; TR : Jeśli wolisz programistycznie pracować z
UIViewController
s, oto kompletny przykład roboczy, który dodaje nowy inicjator z niestandardowym argumentem:class MyCustomViewController: UIViewController { var myString: String = "" convenience init( myString: String ) { self.init() self.myString = myString } }
źródło
myString
jest ustawiona na wartość,""
więcinit
nie jest wymagana. To rozwiązanie rozpada się, jeśli nie chcesz używać wartości początkowej, a w takim przypadku musisz użyćself.init(nibName: nil, bundle:nil)
myString
nieruchomość opcjonalnąAby poprawić odpowiedź okulusa :
init() { super.init(nibName: nil, bundle: nil) }
źródło
Aktualizacja: dodaj link
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init
Zgodnie z dokumentacją dla systemu iOS wyznaczonym inicjatorem dla UIViewController jest
initWithNibName: bundle:
.Możesz to zrobić w następujący sposób:
init(objectId : NSManagedObjectID) { super.init(nibName: (xib's name or nil'), bundle: nil) // other code... }
lub
Zadeklaruj nowy inicjator jako wygodny inicjator:
convenience init( objectId : NSManagedObjectID ) { self.init() // other code...
}
źródło