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