为什么我不能在Swift中的UIViewController上调用默认的super.init()?
我没有使用从StoryBoards UIViewController,我想有一个自定义的init函数,我传入一个对象的NSManagedObjectID。 我只想调用super.init(),就像我在目标c中那样。 喜欢这个:
init(objectId : NSManagedObjectID) { super.init() }
但是我不能编译。 我能不能再这样做了?
我得到的编译器错误消息:“必须调用超类uiviewcontroller的指定初始值设定项”
UIViewController
的指定初始化程序是initWithNibName:bundle:
UIViewController
你应该调用它。
如果您没有nib,则传入nib作为nibName(捆绑包也是可选的)。 然后,你可以在loadView
构造一个自定义的视图,或者在viewDidLoad
添加子视图到self.view
中,和以前一样。
另一个不错的解决scheme是将新的初始化程序声明为convenience
初始化程序,如下所示:
convenience init( objectId : NSManagedObjectID ) { self.init() // ... store or user your objectId }
如果你在你的子类中没有声明任何指定的初始值设定项,它们会自动inheritance,你可以在你的便捷初始值设定项中使用self.init()
。
在UIViewController的情况下,默认的init方法将调用init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
, nil
为这两个参数(命令 – 单击UIViewController将给你的信息)。
TL; TR :如果您更喜欢以编程方式使用UIViewController
这里是一个完整的工作示例,它添加了一个带有自定义参数的新构造器:
class MyCustomViewController: UIViewController { var myString: String = "" convenience init( myString: String ) { self.init() self.myString = myString } }
根据iOS的文档,UIViewController的指定初始化程序是initWithNibName: bundle:
:。
如果您inheritanceUIViewController,则即使您不使用NIB,也必须调用此方法的超级实现。
你可以这样做:
init(objectId : NSManagedObjectID) { super.init(nibName: (xib's name or nil'), bundle: nil) // other code... }
要么
声明一个新的初始化器作为一个方便的初始化器:
convenience init( objectId : NSManagedObjectID ) { self.init() // other code...
}
为了改善occulus的答案:
init() { super.init(nibName: nil, bundle: nil) }
- UILabel将文本alignment到中心
- 检测是否应用:didReceiveRemoteNotification:fetchCompletionHandler:通过点击Notification Center中的通知来调用
- BOOL与iOS上的64位
- 可以在iOS中处理自己的http URLscheme?
- 最好的方法来检查UITableViewCell是否完全可见
- 在Swift中进行REST API调用
- NSDate – 将date转换为GMT
- 是否有可能注册一个基于http +域名的iPhone应用程序的URL计划,如YouTube和地图?
- Swift3 iOS – 如何使UITapGestureRecognizer触发器function