为什么我不能在Swift中的UIViewController上调用默认的super.init()?

时间:2014-06-07 07:48:11

标签: ios objective-c uiviewcontroller swift ios8

我没有在故事板中使用UIViewController,我想要一个自定义init函数,我传入了某个对象的NSManagedObjectID。我只想像在Objective-C中一样调用super.init()。像这样:

init(objectId: NSManagedObjectID) {
    super.init()
}

但是我得到以下编译器错误:

  

必须调用超类UIViewController的指定初始值设定项

我可以不再这样做吗?

4 个答案:

答案 0 :(得分:93)

UIViewController的指定初始值为initWithNibName:bundle:。你应该打电话给那个。

请参阅http://www.bignerdranch.com/blog/real-iphone-crap-2-initwithnibnamebundle-is-the-designated-initializer-of-uiviewcontroller/

如果您没有笔尖,请传入nil以获取nibName(包也是可选的)。然后,您可以在loadView中构建自定义视图,或者将self.view中的子视图添加到viewDidLoad,与以前相同。

答案 1 :(得分:36)

另一个不错的解决方案是将新的初始化程序声明为convenience初始化程序,如下所示:

convenience init( objectId : NSManagedObjectID ) {
    self.init()

    // ... store or user your objectId
}

如果您在子类中根本没有声明指定的初始值设定项,它们会自动继承,您可以在便捷初始化程序中使用self.init()

对于UIViewController,默认的init方法将为init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)调用nil两个参数(UIViewController上的Command-Click将为您提供该信息)。

TL; TR :如果您更喜欢以编程方式使用UIViewController,这是一个完整的工作示例,它添加了一个带有自定义参数的新初始化程序:

class MyCustomViewController: UIViewController {
    var myString: String = ""

    convenience init( myString: String ) {
        self.init()

        self.myString = myString
    }
}

答案 2 :(得分:8)

更新:添加链接

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init

根据iOS的文档,UIViewController的指定初始化程序为initWithNibName: bundle:

  

如果你是UIViewController的子类,你必须调用这个方法的超级实现,即使你没有使用NIB。

您可以按照以下方式执行此操作:

init(objectId : NSManagedObjectID) {

    super.init(nibName: (xib's name or nil'), bundle: nil)

   // other code...
}

将新的初始化程序声明为便利初始化程序:

 convenience init( objectId : NSManagedObjectID ) {

    self.init()

     // other code...

}

答案 3 :(得分:7)

改善 occulus的答案:

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