iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

打造專案管理 iOS App 系列 第 15

安能取熊掌而捨魚? addTarget 邏輯疑解

  • 分享至 

  • xImage
  •  

安能取熊掌而捨魚? addTarget 邏輯疑解

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。

一個位掩碼,用於指定針對其調用操作方法的控件特定事件。始終指定至少一個常數。有關可能的常量的列表。

您可以多次調用此方法來為控件配置多個目標和操作。使用目標和操作參數的相同值多次調用此方法也是安全的。該控件維護其附加目標和操作以及每個事件支持的事件的列表。

控件未將對象保留在目標參數中。當目標對象附加到控件時,您有責任保持對目標對象的強烈引用。


使用 addTarget 的三種方法

  1. 這種寫法會讓button的配置代碼變得分散,在初始化的時候配置樣式,之後再addTarget。
let button: UIButton = ...
    
    override func viewDidLoad() {
        ...
        button.addTarget(self,
            action: #selector(click),
            for: .touchUpInside)
    }
  1. 這種寫法會讓button的配置代碼變得分散,在初始化的時候配置樣式,之後再addTarget。
let button: UIButton
    
    override init() {
        button = ...
        
        super.init()
        
        button.addTarget(self,
            action: #selector(click),
            for: .touchUpInside)
    }
  1. 直接給addTarget傳入nil,讓action順著響應鏈去尋找responder的話,就沒有必要在button初始化時明確responder。
lazy var button: UIButton = {
        ...
        button.addTarget(nil,
            action: #selector(click), 
            for: .touchUpInside)
        return button
    }()

資料來源:https://kemchenj.github.io/2017-08-10/


個人比較偏向於第三種方式,因為使用code生成UI元件時,這種方法讓code比較集中,方便於管理。


上一篇
安能取熊掌而舍魚 利用 UIImagePickerController 讀取相簿
下一篇
安能取熊掌而捨魚? Singleton 淺解
系列文
打造專案管理 iOS App 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ytyubox
iT邦新手 5 級 ‧ 2020-09-30 16:01:56

不錯的分析,我使用的方式與你的演進差不多,最近使用的方式變成放在 @objc 的附近,不過在 iOS 14,有 UIAction 的方式

https://developer.apple.com/documentation/uikit/uicontrol/3600490-addaction

我要留言

立即登入留言