我不是UIViewController从情节提要中使用a ,而是要有一个自定义init函数,可以在其中传递NSManagedObjectID某些对象的。我只想像super.init()在Objective-C中一样打电话。像这样:
init(objectId: NSManagedObjectID) {
super.init()
}
但是我收到以下编译器错误:
必须调用超类UIViewController的指定初始化程序
我可以不再这样做吗?
Answers:
对于指定的初始化器UIViewController是initWithNibName:bundle:。您应该打电话给它。
如果您没有笔尖,请nil输入nibName(捆绑包也是可选的)。然后,你可以在构建自定义视图loadView或通过添加子视图self.view中viewDidLoad,你一样使用。
initWithCoder:它来自NSCoding协议...我仍然不知道它在初始化UIViewController实例中起什么作用,无论它是UIViewController的“指定”初始化器还是其任何超类。 。
let属性(如果有)后调用此按钮:super.init(nibName: nil, bundle: nil)。
另一个不错的解决方案是将新的初始化程序声明为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中会给你的信息)。
TL; TR:如果您更喜欢以编程方式使用UIViewControllers,那么以下是一个完整的工作示例,该示例添加了一个带有自定义参数的新初始化程序:
class MyCustomViewController: UIViewController {
var myString: String = ""
convenience init( myString: String ) {
self.init()
self.myString = myString
}
}
myString已设置为,""因此init不需要。如果您不想使用初始值,则此解决方案会分崩离析,在这种情况下,您需要使用self.init(nibName: nil, bundle:nil)
myString财产可选
更新:添加链接
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...
}