Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIViewController的双重初始化';Swift中的s子类成员_Ios_Cocoa Touch_Swift - Fatal编程技术网

Ios UIViewController的双重初始化';Swift中的s子类成员

Ios UIViewController的双重初始化';Swift中的s子类成员,ios,cocoa-touch,swift,Ios,Cocoa Touch,Swift,我想制作一个定制的容器视图控制器,并将一些成员添加到UIViewController的子类中。当我尝试使用以下代码从应用程序委托初始化它时: self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window?.rootViewController = CustomContainerViewController() self.window?.makeKeyAndVisible() CustomContainerServ

我想制作一个定制的容器视图控制器,并将一些成员添加到
UIViewController
的子类中。当我尝试使用以下代码从应用程序委托初始化它时:

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window?.rootViewController = CustomContainerViewController()
self.window?.makeKeyAndVisible()
CustomContainerServiceController
中的所有成员都初始化了两次

以下是CustomContainerServiceController的代码:

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?)
    }
}
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)
    }
}
以下是
CustomTabBar
的代码:

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?)
    }
}
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)
    }
}

每当您使用前面提到的代码从应用程序委托初始化
CustomContainerServiceController
时,总是打印两次“init”、“initWithFrame”。

使用了不正确的指定初始值设定项

UIViewController
只有一个指定的初始值设定项
init(nibName-nibNameOrNil:String?,bundle-nibBundleOrNil:NSBundle?

正如其评论所说

指定的初始值设定项。如果您是UIViewController的子类,则必须调用此方法的超级实现,即使您没有使用NIB。(为了方便起见,默认的init方法将为您执行此操作,并为这两个方法参数指定nil。)在指定的NIB中,文件的所有者代理应将其类设置为视图控制器子类,视图出口连接到主视图。如果使用nil nib名称调用此方法,则此class'-loadView方法将尝试加载名称与视图控制器的类相同的nib。如果实际上不存在这样的NIB,那么必须在调用-view之前调用-setView:before,或者重写-loadView方法以编程方式设置视图

因此,每当您重写
UIViewController
init()方法时,
UIViewController
的实现将代表您调用
init(nibName-nibNameOrNil:String?,bundle-nibBundleOrNil:NSBundle?
。因此,
UIViewController
子类中的所有成员都初始化了两次

要解决此问题,请在应用程序委托中使用以下代码

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window?.rootViewController = CustomContainerViewController(nibName: nil, bundle: nil)
self.window?.makeKeyAndVisible()

不要调用
UIViewController的
init()
方法,也不要在子类中重写此方法。

它对我来说是“调用中的额外参数‘bundle’”,为什么?请检查拼写和变量类型