1. 程式人生 > >「iOS造輪子」之UIButton 用Block響應事件

「iOS造輪子」之UIButton 用Block響應事件

俗語說 一個不懶的程式設計師不是好程式設計師

造輪子,也只是為了以後更好的coding。

coding,簡易明瞭的程式碼更是所有程式設計師都希望看到的

無論是看自己的程式碼,還是接手別人的程式碼 都希望一看都知道這程式碼是幹嘛的。。

UI開發中用得最多的控制元件之一的UIButton,大家都知道其繼承於UIControl,即帶響應事件的UIView

點選事件的新增大家都知道是通過

    [buttonObj addTarget:target action:SEL forControlEvents:controlEvents];

這麼一句程式碼來實現,在SEL中選擇的方法響應

後面編碼為了程式碼看上去好看一點(偷懶) 改成了Block式響應

這個Block響應會在什麼時候使用呢?如果處理的內容比較簡單的話是無妨的,而且不需要作為外部方法被呼叫

實際上是這樣的

上面註釋掉的是原來新增響應的方式,下面則是block式響應

有個不好的是要處理好迴圈引用的問題

增加block式響應 步驟如下

首先建立UIButton的Category

新增 例項方法

- (void)addActionBlock:(void(^)())block forControlEvents:(UIControlEvents)controlEvents;

這裡的Block 大家可以根據需要來加入回撥引數,都是隨大家的。。

然後再加入存放Block的Property

@property (copy,nonatomic) void(^actionBlock)();

顯然,在Category下無法直接新增Property,這裡又需要通過Runtime來做相應的設定了:

在.m中,引入

objc/runtime.h

並實現set和get方法

- (void)setActionBlock:(void (^)())actionBlock{
    objc_setAssociatedObject(self, @selector(actionBlock), actionBlock, OBJC_ASSOCIATION_COPY);
}
- (void (^)())actionBlock{
    
return objc_getAssociatedObject(self, _cmd); }

然後實現剛宣告的addActionBlock方法

- (void)addActionBlock:(void(^)())block forControlEvents:(UIControlEvents)controlEvents{
    self.actionBlock = [block copy];  /** 將方法中的Block拿下 */
    [self addTarget:self action:@selector(__startAction:) forControlEvents:controlEvents];  /** 新增一個事件 */
}

響應:

- (void)__startAction:(UIButton *)sender{
    if (self.actionBlock) self.actionBlock();
}

這就完成了一個事件的響應

後面就可以直接通過

- (void)addActionBlock:(void(^)())block forControlEvents:(UIControlEvents)controlEvents;

來新增這個響應事件了

但是 請注意

由於property中的block 只有1個!!!在設定多個event的時候,原來設定的block會被覆蓋

那麼這種情況該如何解決呢?

傻瓜一點的方法:

不同event分別新增不同的action和block,對應響應即可

相關推薦

iOS輪子UIButton Block響應事件

俗語說 一個不懶的程式設計師不是好程式設計師 造輪子,也只是為了以後更好的coding。 coding,簡易明瞭的程式碼更是所有程式設計師都希望看到的 無論是看自己的程式碼,還是接手別人的程式碼 都希望一看都知道這程式碼是幹嘛的。。 UI開發中用得最多的控制元件之一的UIButton,大家都知道其繼承於UIC

智能貨櫃福櫃技術占據先機 為消費者謀便利為商家謀福利

term 打開 適用於 ron 卷積神經網絡 應對 tps image 上架 在消費升級的背景下,新零售成為了互聯網行業乃至整個社會中的熱詞。消費者對便利和快捷的追求也越來越強烈,福櫃科技為了滿足消費者需求,推出無人智能貨櫃,從高成本超市到無人零售,福櫃無人智能貨櫃成為新零

利用電腦探討中國古代益智遊戲─華容道解法

利用電腦求解,可以記錄下哪些盤面已經走過,避免浪費時間在相同搜尋重覆的路徑;除此之外,可以依循一定的規則來展開每一個盤面中所有能移動的方法。如此,窮舉所有的可能,只要給定的盤面有解,一定能找到解,剩下的只是求解需要時間的長短罷了。但因為解答的步數有過100步以上的,所以不能直接以暴力法去窮舉。以下我們說明如何

不要重複輪子系列 前端常用外掛、工具類庫彙總

前言 在開發中,我們經常會將一些常用的程式碼塊、功能塊進行封裝,為的是更好的複用。那麼,被抽離出來獨立完成功能,通過API或配置項和其他部分互動,便形成了外掛。 下面這些是我在工作中積累的一些常用的前端開源外掛,這裡只是羅列出來,詳細的用法各個外掛官網或者Gayhub都有介紹。

輪子——cicada 設計一個配置模組

前言 在前兩次的 cicada 版本中其實還不支援讀取配置檔案,比如對埠、路由的配置。 因此我按照自己的想法建立了一個 issue ,也收集到了一些很不錯的建議。 最終其實還是按照我之前的想法來做了這個配置管理。 同時將 cicada 升級到了 v1.0.2。

輪子——設計 HTTP 請求全域性上下文

前言 本次 Cicada 已經更新到了 v1.0.3。 所以本次的主要更新為: Cicada 採用合理的執行緒分配來處理接入請求執行緒以及 IO 執行緒。 支援多種響應方式(以前只有 json,現在支援 text)。 為了滿足上者引入了 context。 優雅停機。 其中我覺得最核心也最有用的就是這

輪子 | 怎樣設計一個面向協議的 iOS 網絡請求庫

結果 格式 object iscroll att main rac hide hud 近期開源了一個面向協議設計的網絡請求庫 MBNetwork,基於 Alamofire 和 ObjectMapper 實現,目的是簡化業務層的網絡請求操作。 須要幹

mysql優化專題90%程序員面試都得上的索引優化手冊(5)

根據 eat index 重要 進行 需要 範圍查詢 記錄 文件的 目錄(技術文) 多關於索引,分為以下幾點來講解: 一、索引的概述(什麽是索引,索引的優缺點) 二、索引的基本使用(創建索引) 三、索引的基本原理(面試重點) 四、索引的數據結構(B樹,hash) 五、創建索

GitHub 系列Git 進階

編輯器 github 推薦一個 一點 發布 組合 ict 全部 符號 1.用戶名和郵箱 我們知道我們進行的每一次 commit 都會產生一條 log,這條 log 標記了提交人的姓名與郵箱,以便其他人方便的查看與聯系提交人,所以我們在進行提交代碼的第一步就是要設置自己的用

Light libraries是一組通用的C基礎庫,目標是為減少重復輪子而寫(全部POSIX C實現)

six clas 原子操作 roi 實現 class 動態庫 readme tps Light libraries是一組通用的C基礎庫,目標是為減少重復造輪子而寫實現了日誌、原子操作、哈希字典、紅黑樹、動態庫加載、線程、鎖操作、配置文件、os適配層、事件驅動、工作隊列、RP

零元學Expression Design 4 - Chapter 3 看小光被包圍了!!如何活Text On Path設計效果

expr 彎曲 圖形 borde 快捷 att 簡單的 efault object 原文:零元學Expression Design 4 - Chapter 3 看小光被包圍了!!如何活用「Text On Path」設計效果

ios的Reachability

#import <Foundation/Foundation.h>   @interface NetWorkTool : NSObject + (instancetype)shareInstance; - (void)startListing; @end   &n

iOS開發關於一對一視訊聊天直播系統技術(二)處理

針對視訊直播的實時流網路 LiveNet 和完整的直播雲解決方案,很多開發者對這個網路和解決方案的細節和使用場景非常感興趣。 結合實時流網路 LiveNet 和直播雲解決方案的實踐,我們將用一系列文章,更系統化地介紹當下大熱的視訊直播各環節的關鍵技術,幫助視訊直播創業者們更全面、深入地瞭解視訊直播技術,更好

iOS開發關於一對一視頻聊天直播系統技術(二)處理

包含 live 能力 white 檢測 google 深入 防盜 視頻內容 針對視頻直播的實時流網絡 LiveNet 和完整的直播雲解決方案,很多開發者對這個網絡和解決方案的細節和使用場景非常感興趣。 結合實時流網絡 LiveNet 和直播雲解決方案的實踐,我們將用一系列文

iOS筆記UIButton的UIEdgeInsetsMake使用詳解

1、UIEdgeInsetsMake介紹 首先簡單介紹一下UIEdgeInsetsMake 引用:UIEdgeInsetsMake使用詳解的圖片和講解,再加上自己的理解與實現 先看定義 typedef struct UIEdgeInsets { CGFloat top

【LOJ2330】清華集訓 2017榕樹

【題目連結】 點選開啟連結 【思路要點】 首先,樹是二分圖,只有一側的點可能成為心。 維護每一棵子樹會產生的向下推動的次數可能的最大值

Java介面自動化測試Mock介面平臺,讓你的自動化更提前

前言:目前Mock技術已經比較成熟,在日常的工作中Mock也可以給我們帶來很大的遍歷,本篇文章將會使用Moco框架,一步一步搭建一套Mock Server,使得介面的自動化測試更加的提前,也能夠使得前後端分離。 共識與痛點 目前,在軟體行業內,大家已經達成的共識就是,測試

精讀《怎麼 React Hooks 輪子

1 引言 上週的 精讀《React Hooks》 已經實現了對 React Hooks 的基本認知,也許你也看了 React Hooks 基本實現剖析(就是陣列),但理解實現原理就可以用好了嗎?學的是知識,而用的是技能,看別人的用法就像刷抖音一樣(哇,飯還可以這樣吃?),你總會有新的收穫。 這篇文章將這些

iOS知識小集 2018 · 第 38 期

原文連結 更新:前兩週我們發了一條小集《Xcode 10.1 並沒有修復由於 Assets 引起的在 iOS 9 上的崩潰問題》,根據最新訊息,蘋果已經在伺服器端解決了這個問題,開發者通過 Xcode 10.1 打的 ipa 包在上傳到蘋果後臺,蘋果在處理包的過程中會自動修復。小夥伴們已親自驗證,不會

未明學院學員報告:看電影攻略豆瓣電影票房與口碑分析,這幾類電影不易踩雷!

要說有什麼經濟實惠、老少咸宜的娛樂休閒方式,當然非看電影莫屬啦~~ 心血來潮,說看就看的你,如何盲選電影避免踩雷?今天就奉上未明學院L同學的資料報告之看電影攻略,教你最小化踩雷風險。 前言 以下分析報告作者: 未明學院資料分析訓練營學員 中央財經大學 市場營銷 大三 資料說明