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 的调用, 它的用法很神奇。假如我们有这样的需求,


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();
                }
                
            }];
        }
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 6,990评论 2 26
  • 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回...
    Clark_new阅读 3,395评论 0 4
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 9,175评论 0 23
  • 一、Objective-C发展史 Objective-C从1983年诞生,已经走过了30多年的历程。随着时间的推移...
    没事蹦蹦阅读 11,136评论 12 34
  • 一、block当做一个参数来使用比如说声明了一个方法:- (void)closeWithTask:(void (^...
    JoshuaC阅读 3,173评论 1 2

友情链接更多精彩内容