Bad*_*Cat 78 initialization objective-c uiviewcontroller ios swift
如何UIViewController在Swift中为子类添加自定义初始值设定项?
我创建了一个UIViewController看起来像这样的子类:
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到一个致命的错误:
致命错误:对类'MyApp.MyViewController'使用未实现的初始化程序'init(nibName:bundle :)'
我已经读过,在添加自定义初始化程序时,还必须覆盖,init(coder aDecoder:NSCoder)所以让我们覆盖它init,看看会发生什么:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Run Code Online (Sandbox Code Playgroud)
如果我添加这个,Xcode会抱怨self.leftVC is not initialized at super.init call.所以我想这也不是解决方案.所以我想知道如何将自定义初始化器正确地添加到ViewControllerSwift中的子类中(因为在Objective-C中这看起来不是问题)?
Bad*_*Cat 107
解决了!一个人必须调用指定的初始化程序,在这种情况下是带有nibName的init,显然......
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC
self.rightVC = rightVC
self.gap = gap
super.init(nibName: nil, bundle: nil)
setupScrollView()
setupViewControllers()
}
Run Code Online (Sandbox Code Playgroud)
emr*_*tci 13
斯威夫特 5
如果你想编写自定义初始化器UIViewController,初始化为storyBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
您可以仅为Optional属性编写自定义初始值设定项。
class MyFooClass: UIViewController {
var foo: Foo?
init(with foo: Foo) {
self.foo = foo
super.init(nibName: nil, bundle: nil)
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.foo = nil
}
}
Run Code Online (Sandbox Code Playgroud)
wli*_*gke 11
不确定你是否设法完全解决这个问题......但是根据你想要你的类界面的外观以及你是否真的需要编码器功能,你也可以使用下面的代码:
convenience required init(coder aDecoder: NSCoder)
{
//set some defaults for leftVC, rightVC, and gap
self.init(leftVC, rightVC, gap)
}
Run Code Online (Sandbox Code Playgroud)
由于init:leftVC:rightVC:gap是指定的初始化程序,您可以init:coder通过使其成为调用指定初始化程序的便捷初始化程序来满足实现的要求.
这可能比
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Run Code Online (Sandbox Code Playgroud)
因为如果你需要初始化一些属性,那么你需要重写它们.
Tr0*_*0yJ 11
对于更通用的UIViewController,您可以在Swift 2.0中使用它
init() {
super.init(nibName: nil, bundle: nil)
}
Run Code Online (Sandbox Code Playgroud)