iOSBlock学习笔记

一、基本语法
定义块的格式如下:

1.定义无参无返回值的块

void (^printStr)(void) = ^(void){
    NSLog(@"这是定义无参无返回值的块");
}

2定义带参有返回值的块

int (^add)(int,int) = ^(int a,int b){
    return a + b;
}

3.调用块

printStr();
int c = add(3,4) // c = 7

block的基本语法大概就是这样,下面主要讲一讲blcok做为property属性在页面中传值回调的问题。大概就是第一个页面一个label,把第二个页面textfiled中输入的内容传入第一个页面在label上显示,直接上代码

首先在第二个页面.h中定义一个块属性

@property(nonatomic,copy) void (^nextViewControllerBlock) (NSString *text);

.m文件中

- (IBAction)backClicked:(id)sender {
    //如果块被调用了,则执行
    if (self.nextViewControllerBlock) {
        self.nextViewControllerBlock(self.textFiled.text);//把输入的内容传入块中
    }
    [self.navigationController popViewControllerAnimated:YES];
}

然后在第一个ViewController.m中

- (IBAction)nextClicked:(id)sender {
    UIStoryboard *main = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    NextViewController *nextVc = [main instantiateViewControllerWithIdentifier:@"2"];//这是直接在Storyboard中加载第二个界面,直接alloc init会导致黑屏,具体不多说,我不建议用Storyboard
    //调用块
    nextVc.nextViewControllerBlock = ^(NSString *text){
        self.label.text = text;//把回调过来的值显示在label中
    };
    [self.navigationController pushViewController:nextVc animated:YES];
}

之前我一直不懂的是,第一个页面点击了按钮过后,会先执行

nextVc.nextViewControllerBlock = ^(NSString *text){
        self.label.text = text;//把回调过来的值显示在label中
    };

这段代码,然后我就觉得很奇怪,如果现在就执行了,那是怎么把值传过来的呢?
后来我打断点跟踪,才发现它是先执行了这段代码,也就相当于给这个块赋值,定义了这个块,但这里也只是定义,并没有执行中括号中的内容,只有当调用这个块的时候,才会执行中括号中的内容,也就是当点击了第二个返回按钮,也就是这段代码

if (self.nextViewControllerBlock) {
        self.nextViewControllerBlock(self.textFiled.text);//把输入的内容传入块中
    }

这里的判断就是判断该块是否被定义,如果定义,则调用这个块,并且把值回调过去。
本人愚钝,搞了半天才理解,希望大神指教

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值