Sir*_*III 70 objective-c uiviewcontroller ios swift ios8
我没有使用UIViewController故事板中的一个,我希望有一个自定义init函数,我传入NSManagedObjectID一些对象.我只想像super.init()在Objective-C中一样打电话.像这样:
init(objectId: NSManagedObjectID) {
super.init()
}
Run Code Online (Sandbox Code Playgroud)
但是我得到以下编译器错误:
必须调用超类UIViewController的指定初始值设定项
我可以不再这样做了吗?
occ*_*lus 105
对于指定的初始化器UIViewController是initWithNibName:bundle:.你应该打电话给那个.
如果您没有nib,请传入nilnibName(bundle也是可选的).然后,您可以构建自定义视图,loadView或者通过将子视图添加到self.viewin中viewDidLoad,与以前一样.
Kla*_*aas 39
另一个不错的解决方案是将新的初始化程序声明为convenience初始化程序,如下所示:
convenience init( objectId : NSManagedObjectID ) {
self.init()
// ... store or user your objectId
}
Run Code Online (Sandbox Code Playgroud)
如果您在子类中根本没有声明指定的初始值设定项,它们将自动继承,您可以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
}
}
Run Code Online (Sandbox Code Playgroud)
NcN*_*cNc 11
更新:添加链接
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...
}
Run Code Online (Sandbox Code Playgroud)
要么
声明一个新的初始化器作为便利初始化器:
convenience init( objectId : NSManagedObjectID ) {
self.init()
// other code...
Run Code Online (Sandbox Code Playgroud)
}
为了改善occulus的答案:
init() {
super.init(nibName: nil, bundle: nil)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48070 次 |
| 最近记录: |