我没有使用UIViewController
情节提要中的 a ,我希望有一个自定义init
函数,我可以在其中传入NSManagedObjectID
某个对象的 an 。我只想像super.init()
在 Objective-C 中那样调用。像这样:
init(objectId: NSManagedObjectID) {
super.init()
}
但我收到以下编译器错误:
必须调用超类 UIViewController 的指定初始化器
我可以不再这样做了吗?
我没有使用UIViewController
情节提要中的 a ,我希望有一个自定义init
函数,我可以在其中传入NSManagedObjectID
某个对象的 an 。我只想像super.init()
在 Objective-C 中那样调用。像这样:
init(objectId: NSManagedObjectID) {
super.init()
}
但我收到以下编译器错误:
必须调用超类 UIViewController 的指定初始化器
我可以不再这样做了吗?
UIViewController
为is指定的初始化器initWithNibName:bundle:
。您应该改为调用它。
如果您没有 nib,nil
请输入 nibName(bundle 也是可选的)。loadView
然后,您可以像以前一样在 in或通过向self.view
in添加子视图来构建自定义视图viewDidLoad
。
另一个不错的解决方案是将您的新初始化程序声明为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:如果您更喜欢以编程方式使用UIViewController
s,这里有一个完整的工作示例,它添加了一个带有自定义参数的新初始化程序:
class MyCustomViewController: UIViewController {
var myString: String = ""
convenience init( myString: String ) {
self.init()
self.myString = myString
}
}
为了改善Oculus 的答案:
init() {
super.init(nibName: nil, bundle: nil)
}
更新:添加链接
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...
}