Ios 为什么在集合视图单元格中以编程方式创建的按钮需要是惰性变量?

Ios 为什么在集合视图单元格中以编程方式创建的按钮需要是惰性变量?,ios,swift,uibutton,lazy-initialization,Ios,Swift,Uibutton,Lazy Initialization,如果我在collectionView单元格中以编程方式创建一个按钮,如果我想触发一个添加的目标,为什么我需要将该按钮设置为惰性变量而不是常量 比如说, class Cell: UICollectionViewCell { let xButton: UIButton = { let button = UIButton(type: .system) button.addTarget(self, action: #selector(handleX), for:

如果我在collectionView单元格中以编程方式创建一个按钮,如果我想触发一个添加的目标,为什么我需要将该按钮设置为惰性变量而不是常量

比如说,

class Cell: UICollectionViewCell {

    let xButton: UIButton = {
        let button = UIButton(type: .system)
        button.addTarget(self, action: #selector(handleX), for: .touchUpInside)
        return button
    }()

    @objc func handleX() {
        print("123")
    }

    ...other boiler plate code
}
如果选择了按钮,则不会打印123,但如果我将按钮设置为惰性变量:

class Cell: UICollectionViewCell {

    lazy var xButton: UIButton = {
        let button = UIButton(type: .system)
        button.addTarget(self, action: #selector(handleX), for: .touchUpInside)
        return button
    }()

    @objc func handleX() {
        print("123")
    } 

    ...other boiler plate code
}
123被打印出来


我知道惰性存储属性是一种直到第一次使用它时才计算其初始值的属性。我不清楚为什么它对UIButton很重要。

您不必惰性地初始化变量,除非您像使用
addTarget()一样需要实例本身

您需要将按钮的创建设置为
惰性
,以便您可以访问
self
,该按钮在创建单元格之前不可用。因此,问题不是按钮本身的创建,而是需要访问
self
的目标/操作的设置


或者,您可以在稍后将按钮添加到单元格的视图层次结构时分配目标/操作。

您需要延迟创建按钮,以便可以访问
self
,该按钮在创建单元格之前不可用。或者,您可以稍后指定目标/操作。@vacawama您应该将您的评论作为答案发布。另一个回答的人回答“为什么”的问题没有你回答的那么好。@vacawama如果你把你的评论作为答案发表,我很乐意接受。这是一个好的、简单的、容易理解的答案。非常感谢。