码迷,mamicode.com
首页 > 其他好文 > 详细

block的界面间传值的使用

时间:2015-06-20 22:08:59      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

苹果大力推广的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属性的视图控制器对象时有效的。

 

block的界面间传值的使用

标签:

原文地址:http://www.cnblogs.com/student-hualei/p/4591101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!