2014-08-27 24 views
54

Jak dodać niestandardowe inicjatory do podklas UIViewController w Swift?Swift: niestandardowe inicjalizatory ViewController

I utworzeniu klasy sub UIViewController, który 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(); 
    } 
} 

Kiedy uruchomić go otrzymuję błąd krytyczny:

fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'MyApp.MyViewController'

Czytałem elewhere że kiedy dodając niestandardowy inicjator, należy również zastąpić init(coder aDecoder:NSCoder), więc zmieńmy to init i zobaczmy, co się stanie:

override init(coder aDecoder: NSCoder) 
{ 
    super.init(coder: aDecoder); 
} 

Jeśli dodam to, Xcode skarży się, że self.leftVC is not initialized at super.init call. Myślę więc, że to też nie może być rozwiązanie. Zastanawiam się, w jaki sposób można poprawnie dodać niestandardowe inicjalizatory do podklasy ViewController w Swift (ponieważ w Objective-C nie wydaje się to problemem)?

+0

Jak starasz się swoją instancję 'MyViewController'? –

+0

Dlaczego nie tworzyć wszystkiego w viewDidLoad(), tam możesz zainicjować je tak, jak chcesz – tudoricc

+0

@MikePollard z dualViewCtrl = DualViewCtrl (leftVC: l, rightVC: r, gap: 50) ... Już się dowiedziałem, że muszę użyj inicjalizatora initWithNib. – BadmintonCat

Odpowiedz

74

Rozwiązany! Trzeba zadzwonić do wyznaczonego inicjator, który 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() 
} 
+0

To zadziałało dla mnie. –

+22

Pozbądź się tych brzydkich półkolonii :) – MobileMon

+6

Lubię średniki. Sprawiają, że kod jest mniej niejednoznaczny, zwłaszcza w przypadku tych śmiesznie pełnych nazw i podpisów API Cocoa/Cocoa-Touch. Zła decyzja projektantów Swift o ich usunięcie IMHO. – BadmintonCat

8

Nie wiem, czy udało się w pełni rozwiązać ten problem ... ale w zależności od tego, jak chcesz interfejs do swojej klasy wyglądać i czy rzeczywiście trzeba funkcjonalność koder, można również użyć poniżej:

convenience required init(coder aDecoder: NSCoder) 
{ 
    //set some defaults for leftVC, rightVC, and gap 
    self.init(leftVC, rightVC, gap) 
} 

od init:leftVC:rightVC:gap jest wyznaczony inicjator można spełnić wymóg realizacji init:coder dokonując jej inicjator spożywczy, który wywołuje swoje wyznaczony inicjator.

To może być lepsze niż

override init(coder aDecoder: NSCoder) 
{ 
    super.init(coder: aDecoder); 
} 

bo jeśli trzeba zainicjować pewne właściwości, wtedy trzeba je przepisać.

+3

proszę wyjaśnić – wlingke

5

Dla bardziej rodzajowe UIViewController można wykorzystać jako Swift 2.0

init() { 
    super.init(nibName: nil, bundle: nil) 
} 
Powiązane problemy