亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS開發之自定義Button(集成三種回調模式)

2019-11-14 20:03:34
字體:
來源:轉載
供稿:網友

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

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

    1.當觸摸開始時會調用下面的事件

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

     2.當觸摸取消時會調用下面的事件

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

       3.當觸摸結束時會調用下面的事件

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

    4.當觸摸移動時會調用下面的事件

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

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

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

 

  一、目標動作回調:

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

      1.在MyButton.h中聲明目標動作注冊方法:

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

 

    2.在MyButton.m中進行實現:

 1 //延展 2 @interface MyButton() 3  4 @PRoperty (nonatomic,weak) id target; 5 @property (nonatomic, assign) SEL action; 6  7 @end 8  9 10 //實現11 @implementation MyButton12 //目標動作回調13 -(void)addTarget:(id)target action:(SEL)action14 {15     self.target = target;16     self.action = action;17 }

  

    3.通過target來執行action方法,觸摸完成的事件中讓target執行action方法,執行之前要判斷一下觸摸的釋放點是否在按鈕的區域內,代碼如下:

 1 //當button點擊結束時,如果結束點在button區域中執行action方法 2 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 3 { 4     //獲取觸摸對象 5     UITouch *touche = [touches anyObject]; 6     //獲取touche的位置 7     CGPoint point = [touche locationInView:self]; 8      9     //判斷點是否在button中10     if (CGRectContainsPoint(self.bounds, point))11     {12         //執行action13         [self.target performSelector:self.action withObject:self];  14     }15 16 }

 

    4.在MyViewController中進行button的初始化,并注冊目標方法回調,當點擊button時,我們MyViewController中的tapButton方法就會被執行:

1     //在v2中添加一個button2     MyButton *button = [[MyButton alloc] initWithFrame:CGRectMake(10, 10, 44, 44)];3     4     button.backgroundColor = [UIColor blackColor];5     6     //注冊回調7     [button addTarget:self action:@selector(tapButton)];

 

  二、委托回調 

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

 1 //定義MyButton要實現的協議, 用于委托回調 2 @protocol MyButtonDelegete <NSObject> 3  4 //可選擇的實現 5 @optional 6  7 //當button將要點擊時調用 8 -(void) myButtonWillTap:(MyButton *) sender; 9 10 //當button點擊后做的事情11 -(void) myButtonDidTap: (MyButton *) sender;12 13 //判斷button是否可以被點擊14 -(BOOL) myButtonShouldTap: (MyButton *) sender;15 16 @end

 

    2.在MyButton.h中添加delegate屬性,為了避免強引用循環,定義為weak類型,用于回調的注冊:

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

 

    3.在MyButton.m中當開始點擊按鈕時做一下處理,首先得判斷delegate對象是否實現了協議中的方法如果實現了就通過delegate回調,如果沒實現就不調用

 2 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 3 { 4      5     //判斷myButtonShouldTap是否在degate中實現啦:委托回調 6     if ([self.delegate respondsToSelector:@selector(myButtonShouldTap:)]) 7     { 8         //如果實現了,就獲取button的狀態 9         myButtonState = [self.delegate myButtonShouldTap:self];10 11     } 12     13     //根據按鈕的狀態來做處理14     if (myButtonState)15     {16         //如果myButtonWillTap被實現啦,此時我們就實現myButtonWillTapf方法17         if ([self.delegate respondsToSelector:@selector(myButtonWillTap:)])18         {19             [self.delegate myButtonWillTap:self];20         }21     }22 }

 

    4.在touchesEnded中相應的位置添加如下代碼去執行按鈕點擊時要回調的方法:

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

 

 

    5、在MyViewController.m中注冊委托回調

1     //注冊委托回調2     button.delegate = self;

 

    6、MyViewController要實現MyButtonDelegate,并實現相應的方法

 1 //實現button委托回調的方法myButtonShouldTap:設置button是否好用 2 -(BOOL) myButtonShouldTap:(MyButton *)sender 3 { 4     NSLog(@"我是Delegate:should方法"); 5     return YES; 6 } 7  8 //實現按鈕將要點擊的方法 9 -(void)myButtonWillTap:(MyButton *)sender10 {11     NSLog(@"我是Delegate: will方法");12 }13 14 //實現按鈕點擊完要回調的方法15 -(void) myButtonDidTap:(MyButton *)sender16 {17     NSLog(@"我是Delegate: Did");18 }

 

  三.Block回調

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

 

//button中使用Block回調,定義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中的延展中添加相應的屬性來接受Controller中傳過來的Block

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

  

    3.實現setter方法

 1 //實現block回調的方法 2 -(void)setButtonWillBlock:(ButtonWillAndDidBlock)block 3 { 4     self.willBlock = block; 5 } 6  7 -(void)setButtonDidBlock:(ButtonWillAndDidBlock)block 8 { 9     self.didBlock = block;10 }11 12 -(void) setButtonShouldBlock:(ButtonShouldBlock)block13 {14     self.shouldBlock = block;15 }

 

    4.在MyButton.m中有委托調用的地方加入相應的Block回調,添加的代碼如下:

 1     //block回調 2     if (self.shouldBlock) { 3         //block回調獲取按鈕狀態 4         myButtonState = self.shouldBlock(self); 5     } 6  7  8         //block回調實現willTap 9         if (self.willBlock)10         {11             self.willBlock(self);12         }13 14 15         //block回調16         if (self.didBlock) {17             self.didBlock(self);18         }

 

   5、在MyViewController中調用Button中的setter方法傳入相應的block:

 1      2     //實現button的block回調 3     [button setButtonShouldBlock:^BOOL(MyButton *sender) { 4         NSLog(@"我是Block: should方法/n/n"); 5         return YES; 6     }]; 7      8     [button setButtonWillBlock:^(MyButton *sender) { 9         NSLog(@"我是Block: Will方法/n/n");10     }];11     12     [button setButtonDidBlock:^(MyButton *sender) {13         NSLog(@"我是Blcok: Did方法/n/n");14     }];15     16 17     [self.view addSubview:button];

 

  經過上面的代碼我們的button就擁有三種回調模式了,下面是點擊button控制臺輸出的日志:

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
琪琪第一精品导航| 欧美一区视频在线| 精品欧美一区二区三区| 亚洲人成欧美中文字幕| 欧美精品日韩三级| 久久久久久com| 色播久久人人爽人人爽人人片视av| 久久91超碰青草是什么| 国产精品欧美一区二区三区奶水| 韩国精品美女www爽爽爽视频| 色老头一区二区三区在线观看| 欧美成人午夜剧场免费观看| 久久手机精品视频| 日本免费久久高清视频| 国产精品第3页| 国产欧美精品一区二区三区介绍| 色噜噜国产精品视频一区二区| 国产精品久久久久久av福利| 日韩在线激情视频| 久久久亚洲网站| 精品一区电影国产| 日本精品久久中文字幕佐佐木| 91情侣偷在线精品国产| 97视频国产在线| 亚洲一区二区三区毛片| 懂色av一区二区三区| 青青精品视频播放| 在线视频一区二区| 久久全国免费视频| 久久综合色88| 日韩美女av在线免费观看| 日韩中文字幕亚洲| 亚洲护士老师的毛茸茸最新章节| 中文在线资源观看视频网站免费不卡| 4388成人网| 欧美激情影音先锋| 亚洲一品av免费观看| 欧美日韩精品二区| 欧美在线影院在线视频| 国产欧美精品va在线观看| 国产精品极品美女粉嫩高清在线| www.欧美免费| 国产精品嫩草影院久久久| 一区二区三区视频免费在线观看| 欧美色视频日本高清在线观看| 欧美日韩免费一区| 2019av中文字幕| 久久97精品久久久久久久不卡| 亚洲sss综合天堂久久| 午夜美女久久久久爽久久| 色综合伊人色综合网站| 国产精品免费视频久久久| 欧美成人精品在线观看| 久久香蕉国产线看观看网| 中文字幕久精品免费视频| 在线观看国产精品淫| 亚洲精品美女在线观看播放| 日韩成人在线视频观看| 91社影院在线观看| 亚洲欧美在线一区| 国产z一区二区三区| 国产一区二区动漫| 欧美成人黄色小视频| 人人澡人人澡人人看欧美| 久久在线观看视频| 国产精品一区二区性色av| 91欧美日韩一区| 欧美精品制服第一页| 久久久久久香蕉网| 成人精品视频99在线观看免费| 国产97在线视频| 亚洲精品国产福利| 性视频1819p久久| 亚洲国产精品久久91精品| 中文字幕av一区二区三区谷原希美| 久久97精品久久久久久久不卡| 欧美夫妻性视频| 亚洲第一福利视频| 亚洲精品美女在线观看| 秋霞av国产精品一区| 亚洲色图第一页| 91精品国产综合久久男男| 亚洲图片欧洲图片av| 久久久99久久精品女同性| 91成人免费观看网站| 日韩在线观看精品| 国产精品视频公开费视频| 亚洲色图在线观看| 国产精品久久久久久久久免费看| 国产成人一区二区在线| 国产精品88a∨| 96国产粉嫩美女| 日本久久久a级免费| 日韩视频―中文字幕| 国产精品jvid在线观看蜜臀| 91国自产精品中文字幕亚洲| 国产精品日日摸夜夜添夜夜av| 精品国产一区久久久| 国产亚洲精品美女久久久| 日韩av网址在线| 国产精品亚洲欧美导航| 日韩中文字幕在线播放| 青青草一区二区| 欧美日韩国产成人高清视频| 亚洲女人天堂网| 国产一区二区三区四区福利| 日本乱人伦a精品| 91免费国产视频| 色婷婷av一区二区三区久久| 中文字幕欧美专区| 国产日本欧美一区二区三区| 国产69精品久久久久99| 久久影院资源网| 国产午夜精品全部视频在线播放| 国产日韩综合一区二区性色av| 国产91精品高潮白浆喷水| 国产一区二区欧美日韩| 色视频www在线播放国产成人| 欧美高清激情视频| 热久久免费国产视频| 国产精品久久久久久久久免费看| 欧美大秀在线观看| 精品福利一区二区| 欧美日韩成人免费| 91在线无精精品一区二区| 日韩在线高清视频| 成人免费淫片aa视频免费| 欧美成人一区二区三区电影| 国产精品欧美日韩久久| 亚洲精品v欧美精品v日韩精品| 欧美日韩国产999| 成人自拍性视频| 在线色欧美三级视频| 国产精自产拍久久久久久| 国产精品一区二区三区久久久| 2019中文字幕在线观看| 国产成人精品免高潮在线观看| 亚洲精品视频免费在线观看| 国产精品偷伦免费视频观看的| 81精品国产乱码久久久久久| 欧美丰满少妇xxxxx做受| 国产精品揄拍500视频| 亚洲国产91精品在线观看| 亲子乱一区二区三区电影| 亚洲美女视频网站| 一区二区在线视频| 全色精品综合影院| 欧美一级片一区| 97精品视频在线播放| 久久人91精品久久久久久不卡| 欧美激情区在线播放| 亚洲国产成人精品女人久久久| 一区二区三区四区在线观看视频| www日韩中文字幕在线看| 精品国产91久久久久久老师| 91深夜福利视频| 国产精品偷伦视频免费观看国产| 国内精品400部情侣激情| 欧美日韩不卡合集视频| 欧美国产日韩xxxxx| 欧美成人免费观看| 国产日韩在线视频| 欧美高清在线播放| 国内精品小视频|