我没有在故事板中使用UIViewController
,我想要一个自定义init
函数,我传入了某个对象的NSManagedObjectID
。我只想像在Objective-C中一样调用super.init()
。像这样:
init(objectId: NSManagedObjectID) {
super.init()
}
但是我得到以下编译器错误:
必须调用超类UIViewController的指定初始值设定项
我可以不再这样做吗?
答案 0 :(得分:93)
UIViewController
的指定初始值为initWithNibName:bundle:
。你应该打电话给那个。
如果您没有笔尖,请传入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)
}