苹果大力推广的block语法虽然不易理解,但使用起来十分方便,相对代理协议要少了很多代码和步骤。这里总结下这段时间使用到的不同视图控制器间的block传值。
这里就借用我写的一个项目工程的代码了
1.给视图控制器A设置block属性:
1 #import "MainListBaseViewController.h" 2 3 typedef void(^ChangePlayViewBlock)(NSDictionary *); 4 5 @interface RadioDPlayViewController : MainListBaseViewController 6 7 8 @property (nonatomic, copy) ChangePlayViewBlock changePlayVBlock; 9 10 11 @end
2.在视图控制器B里给视图控制器A的block属性即changePlayVBlock赋值:
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 self.view.backgroundColor = [UIColor grayColor]; 4 5 [self createMainView]; 6 7 //创建数组注意放在tableView的上面。 8 [self createDataSourceArray]; 9 //注意创建添加顺序,先加TableView,再加右视图控制器。 10 [self createMainListTableView]; 11 [self createRightView]; 12 13 // 在这里接受名字为“DPlayVC有值了”的通知,接受到从视图控制器A传过来的通知后执行"assignToBlock:"方法,即self.DPlayVC有了正确的值即指向当前的视图控制器A后再给self.DPlayVC.changePlayVBlock()赋值,此时视图控制器A里的changePlayVBlock()属性就能赋上值了。在视图控制器A里面的showPlayView:方法里调用changePlayVBlock()时就可以有效执行changePlayVBlock()里的内容即这里给changePlayVBlock()赋得值。 14 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(assignToBlock:) name:@"DPlayVC有值了" object:nil]; 15 16 } 17 18 19 - (void)assignToBlock:(NSNotification *)notification 20 { 21 self.DPlayVC.changePlayVBlock = ^void(NSDictionary *dic){ 22 23 [self.musicImage setImage:[dic objectForKey:@"playImgView"]]; 24 self.musicNameLabel.text = [dic objectForKey:@"title"]; 25 self.artistLabel.text = [dic objectForKey:@"artist"]; 26 [self.playBtn setBackgroundImage:[UIImage imageNamed:@"iconfont-bofang-1"] forState:UIControlStateNormal]; 27 }; 28 }
注:这里主要代码是上面的13行后面的代码。这里设置通知中心的原因是因为视图控制器A不是在视图控制器B里创建的,在视图控制器B里调用视图控制器A的block属性并赋值时无法有效赋上值,所以需要接受个通知,即在视图控制器A里给视图控制器B的DPLayVC属性赋self后向外界发送通知,然后视图控制器B接受到通知后再在视图控制器B里调用视图控制器A的block属性并赋值,视图控制器A里向外界发送通知的具体代码片段如下(这里代码主要是16行以及后面的):
1 - (void)showPlayView:(NSInteger)index 2 { 3 [self.playImageView sd_setImageWithURL:[NSURL URLWithString:[[self.musicListTableViewArray[index] playInfo] objectForKey:@"imgUrl"]]]; 4 5 self.titleLabel.text = [[self.musicListTableViewArray[index] playInfo] objectForKey:@"title"]; 6 7 self.likeLabel.text = [NSString stringWithFormat:@"%@",self.model.like]; 8 9 self.commentLabel.text = [NSString stringWithFormat:@"%@",self.model.comment]; 10 11 12 NSString *artistText = [[[self.musicListTableViewArray[index] playInfo] objectForKey:@"authorinfo"] objectForKey:@"uname"]; 13 NSDictionary *dic = @{@"playImgView":self.playImageView.image,@"title":self.titleLabel.text,@"artist":artistText}; 14 15 16 self.rootLeftVC.DPlayVC = self; 17 18 // 给通知中心添加一个通知,当self.rootLeftVC.DPlayVC有值时,向外界发送一个名字即name为"self.rootLeftVC.DPlayVC有值了"的通知,凡名字为此的都可以接受到这个通知。此时在视图控制器B里面就接收到了这个通知,并给self.DPlayVC.changePlayVBlock()赋值,此时self.DPlayVC有值并指向正确的此视图控制器,所以block可以赋上值。 19 [[NSNotificationCenter defaultCenter] postNotificationName:@"DPlayVC有值了" object:self userInfo:nil]; 20 21 22 if (_changePlayVBlock) { 23 _changePlayVBlock(dic); 24 25 } 26 27 }
这样在视图控制器A里调用 -showPlayView:方法后就可以有效执行视图控制器B里给block赋得值。
注意:在外界给某一视图控制器的block属性赋值时一定要注意用于调用block属性的视图控制器对象时有效的。
时间: 2024-11-06 07:36:49