日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS开发之自定义Button(集成三种回调模式)

發(fā)布時間:2025/5/22 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS开发之自定义Button(集成三种回调模式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前面在做東西的時候都用到了storyboard,在今天的代碼中就純手寫代碼自己用封裝個Button。這個Button繼承于UIView類,在封裝的時候用上啦OC中的三種回調(diào)模式:目標(biāo)動作回調(diào),委托回調(diào),Block回調(diào)。具體的內(nèi)容請參考之前的博客:“Objective-C中的Block回調(diào)模式”,“Target-Action回調(diào)模式”,“Objective-C中的委托(代理)模式”。在接下來要封裝的button中將要用到上面的知識點(diǎn)。之前在做新浪微博中的Cell的時候用到了Block回調(diào)來確定是那個Cell上的那個Button。

  在封裝Button之前呢,簡單的了解一下UIView中的觸摸事件:

    1.當(dāng)觸摸開始時會調(diào)用下面的事件

      -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

?    2.當(dāng)觸摸取消時會調(diào)用下面的事件

      -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

   ? ? 3.當(dāng)觸摸結(jié)束時會調(diào)用下面的事件

      -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    4.當(dāng)觸摸移動時會調(diào)用下面的事件

      -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

  所以在封裝自己的button是我們會用上上面的方法,首先新建一個ViewController, 然后把我們新建的ViewController在AppDelegate.m中設(shè)置成我們的根視圖,我們關(guān)于Button的初始化和配置都寫在ViewController中的ViewDidLoad中代碼如下:

1 MyViewController *myViewController = [[MyViewController alloc] init]; 2 self.window.rootViewController = myViewController;

?

  一、目標(biāo)動作回調(diào):

    首先新建一個MyButton類,MyButton類繼承于UIView, 我們就在MyButton類中自定義我們的button.下面要為自定義Button添加目標(biāo)動作回調(diào)接口,步驟如下:

      1.在MyButton.h中聲明目標(biāo)動作注冊方法:

//TargetAction回調(diào) -(void)addTarget:target action:(SEL)action;

?

    2.在MyButton.m中進(jìn)行實(shí)現(xiàn):

//延展 @interface MyButton()@property (nonatomic,weak) id target; @property (nonatomic, assign) SEL action;@end//實(shí)現(xiàn) @implementation MyButton //目標(biāo)動作回調(diào) -(void)addTarget:(id)target action:(SEL)action {self.target = target;self.action = action; }

  

    3.通過target來執(zhí)行action方法,觸摸完成的事件中讓target執(zhí)行action方法,執(zhí)行之前要判斷一下觸摸的釋放點(diǎn)是否在按鈕的區(qū)域內(nèi),代碼如下:

//當(dāng)button點(diǎn)擊結(jié)束時,如果結(jié)束點(diǎn)在button區(qū)域中執(zhí)行action方法 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {//獲取觸摸對象UITouch *touche = [touches anyObject];//獲取touche的位置CGPoint point = [touche locationInView:self];//判斷點(diǎn)是否在button中if (CGRectContainsPoint(self.bounds, point)){//執(zhí)行action[self.target performSelector:self.action withObject:self]; }}

?

    4.在MyViewController中進(jìn)行button的初始化,并注冊目標(biāo)方法回調(diào),當(dāng)點(diǎn)擊button時,我們MyViewController中的tapButton方法就會被執(zhí)行:

//在v2中添加一個buttonMyButton *button = [[MyButton alloc] initWithFrame:CGRectMake(10, 10, 44, 44)];button.backgroundColor = [UIColor blackColor];//注冊回調(diào)[button addTarget:self action:@selector(tapButton)];

?

  二、委托回調(diào) 

   1.在上面的基礎(chǔ)上添加上委托回調(diào),通過委托回調(diào)添加按鈕是否可用,按鈕將要點(diǎn)擊和按鈕點(diǎn)擊后的事件,首先我們得有協(xié)議來聲明這三個方法。協(xié)議我們就不新建文件了,下面的協(xié)議是添加在MyButton.h中的,協(xié)議定義如下:

//定義MyButton要實(shí)現(xiàn)的協(xié)議, 用于委托回調(diào) @protocol MyButtonDelegete <NSObject>//可選擇的實(shí)現(xiàn) @optional//當(dāng)button將要點(diǎn)擊時調(diào)用 -(void) myButtonWillTap:(MyButton *) sender;//當(dāng)button點(diǎn)擊后做的事情 -(void) myButtonDidTap: (MyButton *) sender;//判斷button是否可以被點(diǎn)擊 -(BOOL) myButtonShouldTap: (MyButton *) sender;@end

?

    2.在MyButton.h中添加delegate屬性,為了避免強(qiáng)引用循環(huán),定義為weak類型,用于回調(diào)的注冊:

//委托回調(diào)接口 @property (nonatomic, weak) id <MyButtonDelegete> delegate;

?

    3.在MyButton.m中當(dāng)開始點(diǎn)擊按鈕時做一下處理,首先得判斷delegate對象是否實(shí)現(xiàn)了協(xié)議中的方法如果實(shí)現(xiàn)了就通過delegate回調(diào),如果沒實(shí)現(xiàn)就不調(diào)用

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {//判斷myButtonShouldTap是否在degate中實(shí)現(xiàn)啦:委托回調(diào)if ([self.delegate respondsToSelector:@selector(myButtonShouldTap:)]){//如果實(shí)現(xiàn)了,就獲取button的狀態(tài)myButtonState = [self.delegate myButtonShouldTap:self];} //根據(jù)按鈕的狀態(tài)來做處理if (myButtonState){//如果myButtonWillTap被實(shí)現(xiàn)啦,此時我們就實(shí)現(xiàn)myButtonWillTapf方法if ([self.delegate respondsToSelector:@selector(myButtonWillTap:)]){[self.delegate myButtonWillTap:self];}} }

?

    4.在touchesEnded中相應(yīng)的位置添加如下代碼去執(zhí)行按鈕點(diǎn)擊時要回調(diào)的方法:

1 //點(diǎn)擊結(jié)束要調(diào)用myButtonDidTap 委托回調(diào) 2 if ([self.delegate respondsToSelector:@selector(myButtonDidTap:)]) 3 { 4 [self.delegate myButtonDidTap:self]; 5 }

?

?

    5、在MyViewController.m中注冊委托回調(diào)

1 //注冊委托回調(diào) 2 button.delegate = self;

?

    6、MyViewController要實(shí)現(xiàn)MyButtonDelegate,并實(shí)現(xiàn)相應(yīng)的方法

//實(shí)現(xiàn)button委托回調(diào)的方法myButtonShouldTap:設(shè)置button是否好用 -(BOOL) myButtonShouldTap:(MyButton *)sender {NSLog(@"我是Delegate:should方法");return YES; }//實(shí)現(xiàn)按鈕將要點(diǎn)擊的方法 -(void)myButtonWillTap:(MyButton *)sender {NSLog(@"我是Delegate: will方法"); }//實(shí)現(xiàn)按鈕點(diǎn)擊完要回調(diào)的方法 -(void) myButtonDidTap:(MyButton *)sender {NSLog(@"我是Delegate: Did"); }

?

  三.Block回調(diào)

    1、為我們的按鈕添加Block回調(diào)(把上面的委托回調(diào)改成Block回調(diào)),和之前微博中的Cell的Block回調(diào)類似,首先在MyButton.h中聲明我們要用的Block類型,然后提供Block的set方法:

//button中使用Block回調(diào),定義Block類型 @class MyButton; typedef void (^ButtonWillAndDidBlock) (MyButton *sender); typedef BOOL (^ButtonShouldBlock) (MyButton *sender);//接受block的方法 -(void)setButtonShouldBlock: (ButtonShouldBlock) block; -(void)setButtonWillBlock: (ButtonWillAndDidBlock) block; -(void)setButtonDidBlock:(ButtonWillAndDidBlock) block;

?

?

    2.在MyButton.m中的延展中添加相應(yīng)的屬性來接受Controller中傳過來的Block

1 //接受block塊 2 @property (nonatomic, strong) ButtonWillAndDidBlock willBlock; 3 @property (nonatomic, strong) ButtonWillAndDidBlock didBlock; 4 @property (nonatomic, strong) ButtonShouldBlock shouldBlock;

  

    3.實(shí)現(xiàn)setter方法

//實(shí)現(xiàn)block回調(diào)的方法 -(void)setButtonWillBlock:(ButtonWillAndDidBlock)block {self.willBlock = block; }-(void)setButtonDidBlock:(ButtonWillAndDidBlock)block {self.didBlock = block; }-(void) setButtonShouldBlock:(ButtonShouldBlock)block {self.shouldBlock = block; }

?

    4.在MyButton.m中有委托調(diào)用的地方加入相應(yīng)的Block回調(diào),添加的代碼如下:

//block回調(diào)if (self.shouldBlock) {//block回調(diào)獲取按鈕狀態(tài)myButtonState = self.shouldBlock(self);}//block回調(diào)實(shí)現(xiàn)willTapif (self.willBlock){self.willBlock(self);}//block回調(diào)if (self.didBlock) {self.didBlock(self);}

?

   5、在MyViewController中調(diào)用Button中的setter方法傳入相應(yīng)的block:

//實(shí)現(xiàn)button的block回調(diào)[button setButtonShouldBlock:^BOOL(MyButton *sender) {NSLog(@"我是Block: should方法\n\n");return YES;}];[button setButtonWillBlock:^(MyButton *sender) {NSLog(@"我是Block: Will方法\n\n");}];[button setButtonDidBlock:^(MyButton *sender) {NSLog(@"我是Blcok: Did方法\n\n");}];[self.view addSubview:button];

 經(jīng)過上面的代碼我們的button就擁有三種回調(diào)模式了,下面是點(diǎn)擊button控制臺輸出的日志:

?

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的IOS开发之自定义Button(集成三种回调模式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美激情婷婷 | 国产一区在线播放 | 成年人免费在线观看视频网站 | 国产综合亚洲精品一区二 | 黄色片网站在线观看 | 亚洲精品一区二区口爆 | 国产中出视频 | 裸体视频软件 | 国产精品久久久久久久妇 | 久久一区二区三区四区 | 精品久久五月天 | 小泽玛丽亚在线观看 | 在线免费中文字幕 | 国产视频在线观看网站 | 朝桐光av一区二区三区 | 免费网站www在线观看 | 成人影视在线播放 | 国产麻豆剧果冻传媒白晶晶 | 欧美性猛交bbbbb精品 | 97在线精品视频 | 无码专区久久综合久中文字幕 | 国产高清99 | av在线观 | 大桥未久中文字幕 | 国产伦精品一区二区三区高清 | 成人wwxx免费观看 | 中文字幕亚洲一区 | ass亚洲肉体欣赏pics | 久久爱伊人 | 黄色成人小视频 | 国产欧美日韩中文字幕 | 狠狠一区二区 | 亚洲色成人www永久网站 | 成人av网站在线观看 | 四虎精品视频 | 久草精品在线观看 | 日韩毛毛片 | 国产精品亚洲二区在线观看 | 久久97精品久久久久久久不卡 | 久久人妻无码aⅴ毛片a片app | 亚洲黄色第一页 | 亚洲区久久 | 国产一区二区在线播放视频 | 欧美怡红院| 爱爱视频网址 | 加勒比久久综合 | 漂亮少妇高潮午夜精品 | 91麻豆产精品久久久久久夏晴子 | 十八禁视频网站在线观看 | 色综合91 | 蜜桃色999| 亚洲av无码专区国产乱码不卡 | 一级全黄男女免费大片 | 欧美亚洲日本在线 | 九九综合网 | 久草久草 | 少妇太紧太爽又黄又硬又爽小说 | 干美女视频 | 777午夜 | 一级视频在线播放 | 美国av大片| 国产日韩一区二区三区在线观看 | 国产手机看片 | 性色欲网站人妻丰满中文久久不卡 | 亚洲最新色图 | 天天射美女 | 日本乱论视频 | 亚洲视频在线观看一区二区三区 | 水蜜桃色314在线观看 | av福利在线看 | 一个色综合久久 | 国产精品传媒一区二区 | 丁香激情六月 | 青娱乐超碰 | 日韩免费观看 | 黄页免费视频 | 在线观看网站污 | 欧美日韩人妻一区二区 | 日本大尺度吃奶做爰视频 | 国产视频手机在线观看 | 黄在线观看免费 | 精品免费一区二区三区 | 人妻少妇偷人精品久久性色 | 免费在线国产精品 | 原创少妇半推半就88av | 动漫精品一区 | 欧洲色网站 | 91网站观看 | 亚洲av无码一区二区二三区 | 爱爱免费网址 | 比利时xxxx性hd极品 | 337p粉嫩色噜噜噜大肥臀 | 欧美精品动漫 | 天天干天天操天天舔 | 成年人在线免费观看网站 | 日本不卡视频一区二区 | 欧美三级韩国三级日本三斤在线观看 | 国产亚洲精品成人av久久ww | 国产精品成熟老女人 |