Block

1、Block 传值
2、Block 调用
3、Block属性和其他属性的比较

这里我们先来比较下block的属性声明和变量的比较
属性声明的样子

@property (nonatomic, strong) void(^myBlock)(UILabel *, UILabel *);
@property (nonatomic, strong) UIButton *btn;

这里myBlock就相当于btn, 声明一个属性
方法中接受btn, 方法中接受block
void(^myBlock)(UILabel *, UILabel *)就是将myBlock移到外面

- (void)buttonClick:(UIButton *)button
- (void)cancelWithCompletionBlock:(void(^)(UILabel *, UILabel *))myBlock

Block传值的用法, LoginViewController是模态弹出的控制器(2),FirstViewController.h(相当于1)是主控制器 ,1需要接受2传过来的歌曲名和歌唱者

  • block 的定义, 在2里面定义block
// 用来传递歌曲名和歌唱者
@property (nonatomic, strong) void(^myBlock)(UILabel *, UILabel *);
  • 在2里面调用block, block是不能为空的,所有这里一定要判断
// 这里调用block是因为歌手,歌名都改变了,所以FirstViewController里面也要改变
        if (_myBlock) {
            _myBlock(_singerLable, _songLable);
        }

  • 1需要接受传过来的block
    LoginViewController *loginVc = [[LoginViewController alloc] init];
 //修改动画效果
    loginVc.modalPresentationStyle = UIModalTransitionStyleCrossDissolve;

 // 接受block,用来改变歌名和歌手
    loginVc.myBlock = ^(UILabel *singerLable, UILabel *songLable) {
                             _songlable1.text = songLable.text;
                             _singerLable1.text = singerLable.text;
                         };

Block 的调用, 它的用法很神奇。假如我们有这样的需求,


Block_第1张图片
Snip20160527_1.png

需求是点击发视频,我们本应该弹出发视频的界面对吗? 但是这里我们要先将这六个按钮掉落后,再执行发视频的界面

  • 我们点击发视频按钮,来到这个按钮事件, 然后调用block
- (void)buttonClick:(UIButton *)button {
    // 传递一个block
    [self cancelWithCompletionBlock:^{
        if (button.tag == 0) {
            BSLog(@"发视频");
        }
    }];
}
  • 执行cancelWithCompletionBlock这个方法,这里需要一个block变量接受, 然后等按钮下落动画执行完毕后,调用block执行发视频界面
// 接受block
- (void)cancelWithCompletionBlock:(void(^)())completionBlock {
    // 让控制器的view不能点击
    self.view.userInteractionEnabled = YES;
    
    int beginIndex = 2;
    
    for (int i = beginIndex; i < self.view.subviews.count; i++) {
        UIView *subview = self.view.subviews[i];
        // 基本动画
        POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];
        CGFloat centerY = subview.centerY + BSScreenH;
        anim.toValue = [NSValue valueWithCGPoint:CGPointMake(subview.centerX, centerY)];
        anim.beginTime = CACurrentMediaTime() + (i - beginIndex) * BSCAnimationDelay;
        [subview pop_addAnimation:anim forKey:nil];
        
        // 监听最后一个动画
        if (i == self.view.subviews.count - 1) {
            [anim setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
                [self dismissViewControllerAnimated:YES completion:nil];
                // 执行传进来的block
                // 可以这么写 !completionBlock ? : completionBlock();
                if (completionBlock) {
                    completionBlock();
                }
                
            }];
        }
    }

}

你可能感兴趣的:(Block)