【发布时间】:2018-06-27 11:12:34
【问题描述】:
以下代码位于 UIView 的子类中
我在闭包内设置了cancelButton:
private var cancelButtonClosure: UIButton = {
...
button.addTarget(self, action: #selector(cancel(_:)), for: .touchUpInside)
...
}()
起初我在一个函数中实例化了按钮,如下所示:
func showConfirmationView(...) {
...
let cancelButton = self.cancelButtonClosure
...
addSubview(cancelButton)
...
}
然而,这导致取消函数根本没有被调用(即使布局正确并且按钮突出显示)
所以我做了这些改变:
- 从
cancelButtonClosure中删除了addTarget部分 - 在
showConfirmationView函数中添加了addTarget部分
所以看起来是这样的:
func showConfirmationView(...) {
...
let cancelButton = self.cancelButtonClosure
cancelButton.addTarget(self, action: #selector(cancel(_:)), for: .touchUpInside)
...
addSubview(cancelButton)
...
}
成功了:cancel 函数被调用;但我不知道为什么。我真的很想知道为什么我之前所做的没有奏效。感谢您的见解!
【问题讨论】:
-
您的
cancelButtonClosure并不是真正的闭包,而是它的结果(UIButton的实例),因为您立即使用()执行它。这也意味着您的行let cancelButton = self.cancelButtonClosure不会实例化按钮(因为它已经是),而是将其分配给cancelButton变量。 -
注意事项: 1. 不要将您的按钮命名为
cancelButtonClosure。因为这是您在 {} 中描述的关闭的结果。所以将其命名为cancelButton,它将是您已经初始化的按钮。 2.let cancelButton = self.cancelButtonClosure没有初始化按钮。在这种情况下,您将self.cancelButtonClosure上的引用设置为cancelButton变量,仅此而已。正如我之前写的那样,只使用self.cancelButton或cancelButton。关于你的问题。它不能工作的原因有很多。从视图层次结构开始。也许按钮下放置了另一个视图。 -
我也遇到了这种情况。也写在这里:stackoverflow.com/a/47999822/1265393