我不是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:如果您更喜欢以编程方式使用UIViewController
s,那么以下是一个完整的工作示例,该示例添加了一个带有自定义参数的新初始化程序:
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...
}