Block

作者: Mr丶炎 | 来源:发表于2016-05-29 21:28 被阅读144次

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

}

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

      本文标题:Block

      本文链接:https://www.haomeiwen.com/subject/ntpqdttx.html