我正在尝试使用以下代码声明和初始化属性。
class ClassName: UIViewController {
private let doneButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "doneButtonDidTapped")
func doneButtonDidTapped() {
println("Ulala!")
}
}
但是,我收到了以下错误。
Cannot find an initializer for type 'UIBarButtonItem' that accepts an argument list of type '(title: String, style: UIBarButtonItemStyle, target: ClassName -> () -> ClassName, action: String)'
有人知道这里发生了什么吗?我是否应该放弃尝试使用声明内联初始化属性并在init()方法上进行初始化?
答案 0 :(得分:6)
正如@giorashc所说,由于快速的两阶段初始化,自我尚未初始化,所以你不能这样做。
但我认为你可以创建一个懒惰的inialization:
lazy private var doneButtonItem : UIBarButtonItem = {
[unowned self] in
return UIBarButtonItem(title: "Done", style:UIBarButtonItemStyle.Plain, target: self, action: "doneButtonDidTapped")
}()
答案 1 :(得分:2)
在@ agy的答案中关闭是不必要的,你可以这样做(在Swift 3中):
lazy var button:UIBarButtonItem = UIBarButtonItem(title: "Title", style: .plain, target: self, action: #selector(buttonPressed(_:)))
答案 2 :(得分:1)
由于swift的两阶段初始化,您需要初始化父类,然后才能在继承类中使用self
。
在您的实现中,self
尚未由父类初始化,因为您说应该将其移动到视图控制器的init
方法并在调用父级的初始化方法后创建按钮