Swift: пользовательские инициализаторы ViewController

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

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

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

        super.init();

        setupScrollView();
        setupViewControllers();
    }
}

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

фатальная ошибка: использование нереализованного инициализатора "init (nibName:bundle:) "для класса" 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 это, кажется, не проблема)?

3 ответов


решил его! Очевидно, нужно вызвать назначенный инициализатор, который в этом случае является 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()
}

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

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);
}

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


для более общего UIViewController вы можете использовать это с Swift 2.0

init() {
    super.init(nibName: nil, bundle: nil)
}