2014-08-27 4 views
54

Как добавить пользовательские инициализаторы в подклассы UIViewController в Swift?Swift: пользовательские инициализаторы ViewController

Я создал вспомогательный класс UIViewController, который выглядит примерно так:

class MyViewController : UIViewController 
{ 
    init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) 
    { 
     self.leftVC = leftVC; 
     self.rightVC = rightVC; 
     self.gap = gap; 

     super.init(); 

     setupScrollView(); 
     setupViewControllers(); 
    } 
} 

Когда я запускаю его я получаю фатальную ошибку:

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

Я прочитал elewhere, что когда добавив пользовательский инициализатор, необходимо также переопределить init(coder aDecoder:NSCoder), поэтому давайте переопределим это значение init и посмотрим, что получится:

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

Если я добавлю это, Xcode жалуется, что self.leftVC is not initialized at super.init call. Поэтому я думаю, что это тоже не может быть решением. Поэтому мне интересно, как я могу добавить пользовательские инициализаторы должным образом в подкласс ViewController в Swift (поскольку в Objective-C это, похоже, не проблема)?

+0

Как вы пытаетесь создать экземпляр 'MyViewController'? –

+0

Почему бы не создать экземпляр всего в viewDidLoad(), там вы можете инициализировать их так, как вы хотите – tudoricc

+0

@MikePollard с dualViewCtrl = DualViewCtrl (leftVC: l, rightVC: r, gap: 50) ... Я уже выяснил, что мне нужно используйте инициализатор initWithNib. – BadmintonCat

ответ

74

Решено! Надо позвонить в назначенный инициализатор, который в данном случае является INIT с nibName, очевидно ...

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

Это сработало для меня. –

+22

Избавиться от этих уродливых полуколонок :) – MobileMon

+6

Мне нравятся точки с запятой. Они делают код менее двусмысленным, особенно с теми смехотворно многословными именами и подписями API Cocoa-Touch-Touch. Плохое решение от дизайнеров Swift удалить их IMHO. – BadmintonCat

8

Не уверен, что если вам удалось полностью решить эту проблему ... но в зависимости от того, как вы хотите интерфейс вашего класса, к посмотри и действительно ли вы на самом деле нужна функциональность кодера, вы можете также использовать ниже:

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

Поскольку init:leftVC:rightVC:gap является назначенным инициализатором, вы можете выполнить требование реализации init:coder, сделав его удобство инициализатора, который вызывает ваш назначенный инициализатор.

Это может быть лучше, чем

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

, потому что, если вам необходимо инициализировать некоторые свойства, то вам нужно будет переписать их.

+3

, пожалуйста, объясните downvote – wlingke

5

Для более общего UIViewController вы можете использовать это как Свифт 2.0

init() { 
    super.init(nibName: nil, bundle: nil) 
} 
Смежные вопросы