我不使用从storyboard加载的UIViewController
,我想要一个自定义的init
函数,在其中可以传递某个对象的NSManagedObjectID
。我只想像在Objective-C中一样调用super.init()
。就像这样:
init(objectId: NSManagedObjectID) {
super.init()
}
但是我得到了以下编译器错误:
必须调用父类UIViewController的指定初始化方法
我现在还能不能这样做呢?
我不使用从storyboard加载的UIViewController
,我想要一个自定义的init
函数,在其中可以传递某个对象的NSManagedObjectID
。我只想像在Objective-C中一样调用super.init()
。就像这样:
init(objectId: NSManagedObjectID) {
super.init()
}
但是我得到了以下编译器错误:
必须调用父类UIViewController的指定初始化方法
我现在还能不能这样做呢?
UIViewController
的指定初始化器是initWithNibName:bundle:
。您应该调用它。nil
。然后,您可以在loadView
中构建自定义视图,或者通过在viewDidLoad
中向self.view
添加子视图来完成,就像您之前使用的一样。另一个不错的解决方案是将您的新初始化程序声明为 convenience
初始化程序,如下所示:
convenience init( objectId : NSManagedObjectID ) {
self.init()
// ... store or user your objectId
}
如果在子类中完全没有声明指定的初始化程序,它们会自动继承,并且您可以在方便的初始化程序中使用self.init()
。init(nibName nibNameOrNil: String!,bundle nibBundleOrNil: NSBundle!)
,并为两个参数都使用nil
(在UIViewController上单击命令按钮可以获得该信息)。UIViewController
,这是一个完整的工作示例,它添加了一个具有自定义参数的新初始化程序。class MyCustomViewController: UIViewController {
var myString: String = ""
convenience init( myString: String ) {
self.init()
self.myString = myString
}
}
myString
被设置为""
,所以不需要init
。如果您不想使用初始值,这个解决方案就不奏效了,在这种情况下,您需要使用self.init(nibName: nil, bundle:nil)
。 - Dan RosenstarkmyString
属性设为可选。 - Klaas为了改进occulus的回答:
init() {
super.init(nibName: nil, bundle: nil)
}
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init
根据iOS文档,UIViewController的指定初始化器是initWithNibName: bundle:
。init(objectId : NSManagedObjectID) {
super.init(nibName: (xib's name or nil'), bundle: nil)
// other code...
}
或者
将一个新的初始化方法声明为便利初始化方法:
convenience init( objectId : NSManagedObjectID ) {
self.init()
// other code...
}
initWithNibName:bundle:
是不够的;编译器会抛出错误并建议您还实现(必需的)initWithCoder:
。我猜两者都是指定初始化程序?但只有withCoder
在 Swift 中被标记为“required”... - Nicolas MiariinitWithCoder:
是来自于NSCoding
协议... 我仍然无法确定它在初始化 UIViewController 实例中的作用,无论是 UIViewController 还是其任何超类的 "指定" 初始化程序... - Nicolas Miarilet
属性后,只需调用以下代码即可进行快速复制/粘贴:super.init(nibName: nil, bundle: nil)
。 - Ferran Maylinch