Ank*_*oel 48 uiviewcontroller uikit designated-initializer ios swift
我无法将init方法添加到以下UIViewController类.我需要在init方法中编写一些代码.我必须编写init(编码器)方法吗?即使我添加编码器和解码器方法,我仍然会遇到错误.我也尝试使用没有任何参数的init方法,但这似乎也不起作用.
class ViewController: UIViewController {
    var tap: UITapGestureRecognizer?
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)   {
        super.init(nibName: nil, bundle: nil)
        tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    }
...
...
}
如果我调用不带参数的super.init()方法,则错误为"必须调用超类的指定初始化程序",如果我传递参数nib和bundle,则错误为"必需的初始化程序初始化程序(编码器)".
即使我添加init(编码器)和init(解码器)它也不起作用.
Gla*_*ves 62
我用了:
convenience init() {
    self.init(nibName:nil, bundle:nil)
}
有人建议:
convenience init(){
    self.init()
}
但这会给你一个无限循环.
Jam*_*rch 32
所有这些答案都是半答案.有些人在相关帖子中遇到无限循环,因为他们只是添加convenience init()(如果你没有提供一个独特的init()方法来调用它会递归调用自己),而其他人则忽略了扩展超类.此格式结合了所有解决方案以完全满足问题.
// This allows you to initialise your custom UIViewController without a nib or bundle.
convenience init() {
    self.init(nibName:nil, bundle:nil)
}
// This extends the superclass.
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
}
// This is also necessary when extending the superclass.
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented") // or see Roman Sausarnes's answer
}
编辑:另外,如果你想使用传递给你的convenience init()方法的参数初始化任何类属性而没有所有被覆盖的init()方法抱怨,那么你可以将所有这些属性设置为隐式解包的选项,这是Apple自己使用的模式.
Aar*_*sen 21
您需要覆盖init(nibName:bundle:)初始化程序,并提供init(coder:)所需的初始化程序,并tap在其中初始化:
class ViewController: UIViewController {
    var tap: UITapGestureRecognizer?
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)   {
        print("init nibName style")
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    }
    // note slightly new syntax for 2017
    required init?(coder aDecoder: NSCoder) {
        print("init coder style")
        super.init(coder: aDecoder)
        tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    }
...
...
}
此外,请确保在调用超类初始化程序时,您不仅仅是传递nil给nibName和bundle.你应该放弃传入的内容.
您可以只创建一个便利初始化程序,方便初始化程序不会覆盖init(),而只是调用它使事情变得更容易.
class ViewController: UIViewController {
    var tap: UITapGestureRecognizer?
    convenience init(){
        self.init()
        tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    }
}
我想你必须添加
required init(coder aDecoder: NSCoder) {
    print("init coder")
    super.init(coder: aDecoder)
}
或者
convenience init() {
    self.init()
}
你也必须写init。不要删除它
var tap: UITapGestureRecognizer?
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)   {
    super.init(nibName: nil, bundle: nil)
}
希望能帮助到你
| 归档时间: | 
 | 
| 查看次数: | 71815 次 | 
| 最近记录: |