今天研究了一下iOS block的传值。
场景:
视图A跳转到视图B,当由B视图跳回视图A时,返回一些视图A需要的数据。
block使用时一般是在视图A中调用视图B中的一个方法,该方法的参数中包含block。
所以在视图B的.h文件中定义一个带有block参数的方法。(第一步)
- (void)callMyBlock:(TestBlock)block;//先不要管TestBlock是什么鬼,反正是一个参数的类型
既然在.h文件中定义了个方法,那么就应该在.m中实现这个方法吧。(第二步)
-(void)callMyBlock:(TestBlock)block {
self.myBlock = block;//self.myBlock很明显是TestBlock类型的,不然怎么可以self.myBlock = block;
}
self.myBlock在视图B的.h中声明:
@property (nonatomic,copy)TestBlock myBlock;//上面的callMyBlock执行相当于将传进来的“block”存到这个变量中
现在在视图B中,可以拿到视图A传过来的block(代码块),这个block中写的什么,视图B肯定不知道啊,但是视图B知道block的格式。
现在在视图B中的.h头部定义一下TestBlock;(就算第三步吧,应该算第一步之前的)
typedef void (^TestBlock)(NSString *x) ;//block的名称:TestBlock,返回值:void,参数:NSString类型 x。
到现在为止一直还没有调用过这个block(代码块)呢。仔细想想,B中定义了一个block格式,定义了一个参数为这个格式的block,方法实现是存储这个传进来的block。所以一直没有使用这个block呢。
现在视图B中的myBlock是视图A传过来的block。
所以是不是应该拿着视图A中的block做点什么了。(第四步)
至于在哪里调用这个block,那就看你要在什么时候用咯。
self.myBlock(@"把这些传给视图A");
现在视图B中都弄完了。
在视图A中怎样取出这个“把这些传给视图A”呢?(第五步,调用视图B中定义的方法就可以了)
[viewB callMyBlock:^(NSString *x) {
self.blockText.text = x;//这里的x 就是你在视图B中self.myBlock(@"把这些传给视图A");传的参数咯!!
}];
self.blockText.text = x;
}];
block比喻:
我有一条金鱼(数据)。
想要吗?你得给我我想要的鱼缸(我定义的block)。
你怎么把鱼缸给我我肯定会告诉你啊,是顺丰邮,还是申通。(我定义的一个方法,参数是block)。
上面整个过程没问题了,你的鱼缸里就有鱼了。