为什么我不能在Swift中的UIViewController上调用默认的super.init()?

我没有使用从StoryBoards UIViewController,我想有一个自定义的init函数,我传入一个对象的NSManagedObjectID。 我只想调用super.init(),就像我在目标c中那样。 喜欢这个:

init(objectId : NSManagedObjectID) { super.init() } 

但是我不能编译。 我能不能再这样做了?

我得到的编译器错误消息:“必须调用超类uiviewcontroller的指定初始值设定项”

UIViewController的指定初始化程序是initWithNibName:bundle: UIViewController 你应该调用它。

http://www.bignerdranch.com/blog/real-iphone-crap-2-initwithnibnamebundle-is-the-designated-initializer-of-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) }