private var informationButton:UIButton = {
var button = ButtonFactory.makeButton(type: .normal, text: "information")
button.addTarget(self, action: #selector(UserInfoVC.information), for: .touchUpInside)
return button
}()
第一眼的感覺是這段代碼寫得很有問題,不應該在button初始化的時候addTarget。
因為這個時候self還沒有初始化完成,或者應該使用lazy var
看看官方文件怎麼說明這個寫法。
將目標對象和操作方法與控件關聯。
addTarget 總共有三個Parameters
目標對象,其操作方法被調用的對象。如果指定nil,則UIKit會在響應程序鏈中搜索對指定的操作消息作出響應的對象,並將該消息傳遞給該對象。
一個選擇器,用於標識要調用的操作方法。您可以指定一個選擇器,該選擇器的簽名與清單1中的任何簽名匹配。此參數不能為nil。
一個位掩碼,用於指定針對其調用操作方法的控件特定事件。始終指定至少一個常數。有關可能的常量的列表。
您可以多次調用此方法來為控件配置多個目標和操作。使用目標和操作參數的相同值多次調用此方法也是安全的。該控件維護其附加目標和操作以及每個事件支持的事件的列表。
控件未將對象保留在目標參數中。當目標對象附加到控件時,您有責任保持對目標對象的強烈引用。
let button: UIButton = ...
override func viewDidLoad() {
...
button.addTarget(self,
action: #selector(click),
for: .touchUpInside)
}
let button: UIButton
override init() {
button = ...
super.init()
button.addTarget(self,
action: #selector(click),
for: .touchUpInside)
}
lazy var button: UIButton = {
...
button.addTarget(nil,
action: #selector(click),
for: .touchUpInside)
return button
}()
資料來源:https://kemchenj.github.io/2017-08-10/
個人比較偏向於第三種方式,因為使用code生成UI元件時,這種方法讓code比較集中,方便於管理。
不錯的分析,我使用的方式與你的演進差不多,最近使用的方式變成放在 @objc 的附近,不過在 iOS 14,有 UIAction 的方式
https://developer.apple.com/documentation/uikit/uicontrol/3600490-addaction