Необходимые инициализаторы для подкласса UIViewController

Я пытаюсь выполнить руководство по созданию контроллера представления контейнера. Это в Objective-C. Я хочу преобразовать его в Swift. Я нашел здесь одни и те же вопросы, но из них я не получал слишком много.

Здесь код.

import UIKit

class ContainerViewController: UIViewController { // Class "ContainerViewController" has no initializers - That I know why.

    // 'required' initializer 'init(coder:)' must be provided by a subclass of UIViewController

    var currentDetailViewController: UIViewController

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

Я пробовал делать то, что говорят обе ошибки, но все равно не работает.

Ответ 1

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

Вот так:

var currentDetailViewController: UIViewController

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    currentDetailViewController = UIViewController()
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

convenience override init() {
    self.init(nibName: nil, bundle: nil)
}

required init(coder aDecoder: NSCoder) {
    currentDetailViewController = UIViewController()
    super.init(coder:aDecoder)
}

Но я думаю, что это не, что вы хотите.

Правильное решение зависит от того, где вы инициализируете currentDetailViewController.

Если вы всегда инициализируете его в viewDidLoad, вы можете объявить его как "Неявно отформатированный необязательный"

var currentDetailViewController: UIViewController!

override viewDidLoad() {
    super.viewDidLoad()
    self.currentDetailViewController = DetailViewController()
}

в противном случае, если currentDetailViewController может быть nil, вы должны объявить его как "Необязательный"

var currentDetailViewController: UIViewController?