IOS setOnclick - 點選事件完美擴充套件

suliver發表於2021-09-09
在Android中點選事件是以setOnclick的形式進行設定的,用起來十分方便,而在ios中是以addTarget方式進行的,每次設定點選事件都需要宣告一個新的方法,在大部分情況下顯得未免有些麻煩。而且通常來說我們使用的最多的是TouchUpInside方式的點選事件,所以為了方便使用,我對UIButton/UIView的點選事件進行了擴充套件。

使用

和之前一樣,我們先來看看擴充套件之後如何使用

  • oc版本

[_btn1 setOnclick:^{    NSLog(@"click btn1");
}];
  • swift版本

btn.setOnClick {    print("click btn")
}

用起來真的是非常簡單哈~

擴充套件過程

接下來我們就來看看,到底是如何擴充套件的呢?

  • oc版本
    我們只需要為UIButton新增一個Category就可以使用了哦。

    #import 

    @interface UIButton(click)
    @property (nonatomic, strong) void (^clickBlock) (void);
    - (void) setOnclick : (void (^)(void))block;
    - (void) clickBtn : (UIButton*) sender;
    - (void) setTarget : action:(SEL)action;    @end
    #import "UIButton+click.h"
    #import 
    
    @implementation UIButton(click)
    
    static void *clickKey = &clickKey;
    - (void)setClickBlock:(void (^)(void))clickBlock{
        objc_setAssociatedObject(self, & clickKey, clickBlock, OBJC_ASSOCIATION_COPY);
    }
    
    - (void (^)(void))clickBlock{        return objc_getAssociatedObject(self, &clickKey);
    }
    
    -(void)setOnclick:(void (^)(void))block{        self.clickBlock = block;
        [self addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
    }
    
    - (void) clickBtn : (UIButton*) sender{        self.clickBlock();
    }    
    @end

如果我們不希望每次都需要匯入UIButton+click.h,只需要將UIButton+click.h新增到pch檔案中就可以了哦。

  • swift版本
    相對來說swift版本就比較麻煩一點,竟然不能直接擴充套件閉包型別的屬性,所以最後多建立了一個UIClick物件。

                 

    class UIClick : Any{        var click : () -> Void = {return}
    }    
    extension UIButton : Property{        var saveClick : UIClick{            get{                return get0()
            }            set{                return set0(newValue)
            }
        }        
        func setOnClick(click : @escaping () -> Void) {            self.saveClick = UIClick()            self.saveClick.click = click            self.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
        }        
        @objc func btnClick(){            self.saveClick.click()
        }
    }

UIView onClick

看了以上的擴充套件過程,相信大家對UIView onClick的擴充套件心中也有數了,過程基本是一樣的,接下來只簡單寫一下不同的部分。

    func setOnClickView(click : @escaping () -> Void) {        self.isUserInteractionEnabled = true
        self.saveClickView = UIClick()        self.saveClickView.click = click        let tap = UITapGestureRecognizer(target: self, action: #selector(btnClickView))
        tap.numberOfTapsRequired = 1
        self.addGestureRecognizer(tap)
    }

oc的就略過了,原理是一樣的,程式碼也是非常簡單。

總結

擴充套件並不複雜,但是確實還是帶來了不少方便,希望這種擴充套件思路能夠讓你眼前一亮,以上內容有任何錯誤歡迎指正


作者: sunflowerseat

來源:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2808928/,如需轉載,請註明出處,否則將追究法律責任。

相關文章