欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/5/22 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 IOS开发之自定义Button(集成三种回调模式) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前面在做东西的时候都用到了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中进行实现:

//延展 @interface MyButton()@property (nonatomic,weak) id target; @property (nonatomic, assign) SEL action;@end//实现 @implementation MyButton //目标动作回调 -(void)addTarget:(id)target action:(SEL)action {self.target = target;self.action = action; }

  

    3.通过target来执行action方法,触摸完成的事件中让target执行action方法,执行之前要判断一下触摸的释放点是否在按钮的区域内,代码如下:

//当button点击结束时,如果结束点在button区域中执行action方法 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {//获取触摸对象UITouch *touche = [touches anyObject];//获取touche的位置CGPoint point = [touche locationInView:self];//判断点是否在button中if (CGRectContainsPoint(self.bounds, point)){//执行action[self.target performSelector:self.action withObject:self]; }}

 

    4.在MyViewController中进行button的初始化,并注册目标方法回调,当点击button时,我们MyViewController中的tapButton方法就会被执行:

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

 

  二、委托回调 

   1.在上面的基础上添加上委托回调,通过委托回调添加按钮是否可用,按钮将要点击和按钮点击后的事件,首先我们得有协议来声明这三个方法。协议我们就不新建文件了,下面的协议是添加在MyButton.h中的,协议定义如下:

//定义MyButton要实现的协议, 用于委托回调 @protocol MyButtonDelegete <NSObject>//可选择的实现 @optional//当button将要点击时调用 -(void) myButtonWillTap:(MyButton *) sender;//当button点击后做的事情 -(void) myButtonDidTap: (MyButton *) sender;//判断button是否可以被点击 -(BOOL) myButtonShouldTap: (MyButton *) sender;@end

 

    2.在MyButton.h中添加delegate属性,为了避免强引用循环,定义为weak类型,用于回调的注册:

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

 

    3.在MyButton.m中当开始点击按钮时做一下处理,首先得判断delegate对象是否实现了协议中的方法如果实现了就通过delegate回调,如果没实现就不调用

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {//判断myButtonShouldTap是否在degate中实现啦:委托回调if ([self.delegate respondsToSelector:@selector(myButtonShouldTap:)]){//如果实现了,就获取button的状态myButtonState = [self.delegate myButtonShouldTap:self];} //根据按钮的状态来做处理if (myButtonState){//如果myButtonWillTap被实现啦,此时我们就实现myButtonWillTapf方法if ([self.delegate respondsToSelector:@selector(myButtonWillTap:)]){[self.delegate myButtonWillTap:self];}} }

 

    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,并实现相应的方法

//实现button委托回调的方法myButtonShouldTap:设置button是否好用 -(BOOL) myButtonShouldTap:(MyButton *)sender {NSLog(@"我是Delegate:should方法");return YES; }//实现按钮将要点击的方法 -(void)myButtonWillTap:(MyButton *)sender {NSLog(@"我是Delegate: will方法"); }//实现按钮点击完要回调的方法 -(void) myButtonDidTap:(MyButton *)sender {NSLog(@"我是Delegate: Did"); }

 

  三.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方法

//实现block回调的方法 -(void)setButtonWillBlock:(ButtonWillAndDidBlock)block {self.willBlock = block; }-(void)setButtonDidBlock:(ButtonWillAndDidBlock)block {self.didBlock = block; }-(void) setButtonShouldBlock:(ButtonShouldBlock)block {self.shouldBlock = block; }

 

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

//block回调if (self.shouldBlock) {//block回调获取按钮状态myButtonState = self.shouldBlock(self);}//block回调实现willTapif (self.willBlock){self.willBlock(self);}//block回调if (self.didBlock) {self.didBlock(self);}

 

   5、在MyViewController中调用Button中的setter方法传入相应的block:

//实现button的block回调[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];

 经过上面的代码我们的button就拥有三种回调模式了,下面是点击button控制台输出的日志:

 

《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的IOS开发之自定义Button(集成三种回调模式)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。