你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> UIButton+Block

UIButton+Block

編輯:IOS技巧綜合
[摘要]本文是對UIButton+Block的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

UIButton的一個Category,使用block處理UIControlEvent事件,如常用的TouchUpInside等。
代碼非原創,也是從網上看到的,用到了實際項目中,目前還沒發現什麼問題。

UIButton+Block.h:

 #import <UIKit/UIKit.h>
 #import <objc/runtime.h>
 
 typedef void (^ActionBlock)();
 
 @interface UIButton (Block)
 
 /**
  *  UIButton添加UIControlEvents事件的block
  *
  *  @param event 事件
  *  @param action block代碼
  */
 - (void) handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock)action;
 
 @end

UIButton+Block.m:

 #import "UIButton+Block.h"
 
 @implementation UIButton (Block)
 
 static char eventKey;
 
 /**
  *  UIButton添加UIControlEvents事件的block
  *
  *  @param controlEvent 事件
  *  @param action block代碼
  */
 - (void) handleControlEvent:(UIControlEvents)event withBlock:(void (^)())action {
     objc_setAssociatedObject(self, &eventKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC);
     [self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
 }
 
 - (void)callActionBlock:(id)sender {
     ActionBlock block = (ActionBlock)objc_getAssociatedObject(self, &eventKey);
     if (block) {
         block();
     }
 }
 
 @end

具體使用:

 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
     
     [self.button handleControlEvent:UIControlEventTouchUpInside withBlock:^{
        
         NSLog(@"button touched!");
     }];
 }

附上demo,這裡是鏈接地址。

另外,畢竟是用到了objc_setAssociatedObject動態關聯,雖然不知道有沒有什麼性能影響,但是個人感覺最好不要濫用,比如Button的點擊事件裡代碼量較大時最好還是用原生的處理方法。
如果UIButton是動態創建的,且事件處理邏輯較少(比如就幾行代碼 ),我覺得還是可以使用。我目前是用在自定義導航欄按鈕上。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved