Jak dodać niestandardowe inicjatory do UIViewController
podklas w Swift?
Utworzyłem podklasę, UIViewController
która wygląda mniej więcej tak:
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
Po uruchomieniu otrzymuję fatalny błąd:
błąd krytyczny: użycie niezaimplementowanego inicjatora „init (nibName: bundle :)” dla klasy „MyApp.MyViewController”
Czytałem gdzie indziej, że dodając niestandardowy inicjalizator, należy go również przesłonić, init(coder aDecoder:NSCoder)
więc zastąpmy to init
i zobaczmy, co się stanie:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Jeśli dodam to, Xcode narzeka self.leftVC is not initialized at super.init call
. Więc myślę, że to też nie może być rozwiązaniem. Zastanawiam się więc, jak mogę poprawnie dodać niestandardowe inicjatory do ViewController
podklasy w Swift (ponieważ w Objective-C wydaje się, że nie stanowi to problemu)?
źródło
MyViewController
?Odpowiedzi:
Rozwiązałem to! Należy wywołać wyznaczony inicjator, którym w tym przypadku jest init z nibName, oczywiście ...
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) { self.leftVC = leftVC self.rightVC = rightVC self.gap = gap super.init(nibName: nil, bundle: nil) setupScrollView() setupViewControllers() }
źródło
Aby uzyskać bardziej ogólny kontroler UIViewController, możesz użyć tego od wersji Swift 2.0
init() { super.init(nibName: nil, bundle: nil) }
źródło
Nie jestem pewien, czy udało Ci się w pełni rozwiązać ten problem ... ale w zależności od tego, jak chcesz wyglądać interfejs Twojej klasy i czy faktycznie potrzebujesz funkcji kodera, możesz również użyć poniższego:
convenience required init(coder aDecoder: NSCoder) { //set some defaults for leftVC, rightVC, and gap self.init(leftVC, rightVC, gap) }
Ponieważ
init:leftVC:rightVC:gap
jest wyznaczonym inicjatorem, możesz spełnić wymóg implementacjiinit:coder
, czyniąc go wygodnym inicjatorem, który wywołuje wyznaczony inicjator.To mogłoby być lepsze niż
override init(coder aDecoder: NSCoder) { super.init(coder: aDecoder); }
ponieważ jeśli chcesz zainicjować niektóre właściwości, musisz je przepisać.
źródło
Szybki 5
Jeśli chcesz napisać niestandardowy inicjator, do
UIViewController
którego jest inicjowany zstoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
Możesz napisać niestandardowy inicjator tylko dla
Optional
właściwości.class MyFooClass: UIViewController { var foo: Foo? init(with foo: Foo) { self.foo = foo super.init(nibName: nil, bundle: nil) } public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.foo = nil } }
źródło