【问题标题】:Required initializers for a subclass of UIViewControllerUIViewController 的子类所需的初始化程序
【发布时间】:2014-11-10 07:38:14
【问题描述】:

我一直在尝试学习有关创建容器视图控制器的教程。它在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()
    }

}

我已经尝试按照这两个错误所说的做,但仍然不起作用。

【问题讨论】:

    标签: ios swift uiviewcontroller subclassing


    【解决方案1】:

    问题是:如果你声明任何存储属性没有初始值,你必须实现你自己的初始化器来初始化它们。见this document

    像这样:

    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中初始化它,那么你可以将它声明为"Implicitly Unwrapped Optional"

    var currentDetailViewController: UIViewController!
    
    override viewDidLoad() {
        super.viewDidLoad()
        self.currentDetailViewController = DetailViewController()
    }
    

    否则,如果currentDetailViewController 可以是nil,则应将其声明为"Optional"

    var currentDetailViewController: UIViewController?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2019-06-16
      相关资源
      最近更新 更多