102

我没有使用UIViewController情节提要中的 a ,我希望有一个自定义init函数,我可以在其中传入NSManagedObjectID某个对象的 an 。我只想像super.init()在 Objective-C 中那样调用。像这样:

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

但我收到以下编译器错误:

必须调用超类 UIViewController 的指定初始化器

我可以不再这样做了吗?

4

4 回答 4

136

UIViewController为is指定的初始化器initWithNibName:bundle:。您应该改为调用它。

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

如果您没有 nib,nil请输入 nibName(bundle 也是可选的)。loadView然后,您可以像以前一样在 in或通过向self.viewin添加子视图来构建自定义视图viewDidLoad

于 2014-06-07T07:54:28.227 回答
46

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

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

    // ... store or user your objectId
}

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

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

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

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

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

        self.myString = myString
    }
}
于 2014-08-15T14:41:25.890 回答
27

为了改善Oculus 的答案:

init() {
     super.init(nibName: nil, bundle: nil)
}
于 2017-09-29T13:33:17.550 回答
17

更新:添加链接

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...

}

于 2017-06-24T03:48:27.400 回答