【发布时间】:2017-10-06 04:15:41
【问题描述】:
我在使用惰性var初始化时不知不觉发现了这个UIBarButtonItem目标问题。
class ViewController: UIViewController {
lazy var barButtonItem1 = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(action1))
lazy var barButtonItem2: UIBarButtonItem = {
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(action2))
return barButtonItem
}
override func viewDidLoad() {
super.viewDidLoad()
print(barButtonItem1.target, barButtonItem2.target)
}
}
打印结果显示barButtonItem1.target为nil,barButtonItem2.target为self,看起来很疯狂! 我在使用barButtonItem1的lazy var编写时遇到了这个问题,然后我发现barButtonItem1的action永远无法调用,最后问题是barButtonItem1.target为nil。
我不知道为什么会发生这种情况,但是我很确定这是一个错误。 有人知道吗?如果您能解释一下,我将不胜感激。
【问题讨论】:
-
我认为您的
barButtonItem1操作不正确。首先必须使用数据类型声明lazy var。其次,您只是将其值设置为常规 var。请阅读:hackingwithswift.com/example-code/language/… -
barButtonItem1 的声明应该是正确的,根据link。
-
根据link,barButtonItem1 的声明应该是正确的。但是,我尝试了您所说的为 barButtonItem1 添加数据类型声明,它现在表现良好。我仍然不知道是什么原因造成的。
-
无论如何感谢您的评论!
-
你不应该这样实现栏按钮。为什么需要这种类型的声明?
标签: ios swift uibarbuttonitem lazy-evaluation target