WeZ*_*ard 6 cocoa-touch ios swift
我想创建一个自定义的容器视图控制器,并将一些成员添加到子类中UIViewController.当我尝试使用以下代码从app委托创建它时:
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window?.rootViewController = CustomContainerViewController()
self.window?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)
所有成员CustomContainerViewController都被初始化了两次.
这是CustomContainerViewController代码:
class CustomContainerViewController: UIViewController {
let tabBar = CustomTabBar()
override init() {
super.init()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil?, bundle: nibBundleOrNil?)
}
}
Run Code Online (Sandbox Code Playgroud)
这是CustomTabBar代码:
class CustomTabBar: UIView {
override init(){
println("init")
super.init()
}
override init(frame: CGRect) {
println("initWithFrame:")
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
println("initWithCoder:")
super.init(coder: aDecoder)
}
}
Run Code Online (Sandbox Code Playgroud)
每当您CustomContainerViewController使用前面提到的代码从应用程序委托中初始化时,总是打印"init","initWithFrame"两次.
使用的指定初始化程序不正确.
UIViewController只有一个指定的初始化程序init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?).
正如其评论所说
指定的初始化程序.如果您是UIViewController的子类,则必须调用此方法的超级实现,即使您没有使用NIB也是如此.(为方便起见,默认的init方法将为您执行此操作,并为这两个方法参数指定nil.)在指定的NIB中,File的Owner代理应将其类设置为视图控制器子类,并使用视图插座连接到主视图.如果使用nil nib名称调用此方法,则此类的-loadView方法将尝试加载名称与视图控制器类相同的NIB.如果事实上不存在这样的NIB,则必须在调用-view之前调用-setView:或覆盖-loadView方法以编程方式设置视图.
因此,无论何时覆盖init()方法UIViewController,一旦调用super,UIViewController执行将init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)代表您调用.所以你UIViewController子类中的所有成员都被初始化了两次.
要解决此问题,请在app委托中使用以下代码
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window?.rootViewController = CustomContainerViewController(nibName: nil, bundle: nil)
self.window?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)
永远不要在子类中调用init()方法UIViewController或覆盖此方法.
| 归档时间: |
|
| 查看次数: |
1880 次 |
| 最近记录: |