iOS中三种回调机制

/ 2评 / 0

一、目标动作回调

首先新建一个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中添加一个button
     MyButton *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 
  
  //可选择的实现
  @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  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中相应的位置添加如下代码去执行按钮点击时要回调的方法:
         //点击结束要调用myButtonDidTap  委托回调
         if ([self.delegate respondsToSelector:@selector(myButtonDidTap:)])
         {
             [self.delegate myButtonDidTap:self];
         }
 
 
5、在MyViewController.m中注册委托回调
     //注册委托回调
     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
//接受block块 @property (nonatomic, strong) ButtonWillAndDidBlock willBlock;
 @property (nonatomic, strong) ButtonWillAndDidBlock didBlock;
 @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回调实现willTap
         if (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就拥有三种回调模式了.

2条回应:“iOS中三种回调机制”

  1. 啦啦啦说道:

    代码高亮。。。就喜欢这个字体主题