block的界面间传值的使用

苹果大力推广的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

block的界面间传值的使用的相关文章

界面间传值

- (void)viewWillDisappear:(BOOL)animated{    ///界面间传值:第二种情况:将后一个界面的值传到前一个界面 (从后往前传)    // 方法: 代理初值    // 步骤:  1.定义协议. 在后面类中定义协议(传值的方法定义协议)    //2. 给后面类添加一个代理属性    //3.将代理设置为前一个界面的对象让它服从协议,实现方法(传值方法就变成了,协议中的方法),    //4.在后面类中通过代理,调用该传值方法.              

界面间传值的方式

属性传值: 属性传值适用于从前往后传值. 代理传值:适用于从后往前传值. 单例传值: 适合于从前往后传,从后往前传都可以, 但是内存空间不会被释放直到应用程序结束 NSUserDefaults:数据持久化的一种方式,数据可以长久的存储,存到本地然后再从本地获取.通知:通知的使用需要注册通知,以及发送通知. block: 需要定义 block,当 block 进行回调时将值传给其他界面,适用于从后往前 初始化方法:给第二个界面写一个初始化方法,当进入下一界面时,将第一个界面的值作为初始化方法的参数

iOS中的导航条(UISegmentedControl)的基本使用(界面中传值的3中方法)

Appdelegate中 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; //1.创建单视图控制器对象, FirstViewControll

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一下: 情况1:A页面跳转到B页面 方法: 在B页面的控制器中,编写对应的属性,在A页面跳转到B页面的地方,给

iOS 页面间传值 之 单例传值 , block 传值

ios 页面间传值有许多,前边已经分享过属性传值和代理传值,今天主要说一下单例传值和 block 传值 单例传值:单例模式一种常用的开发的模式,单例因为在整个程序中无论在何时初始化对象,获取到的都是同一个对象,对象的属性相同,所以可以用来传值. block 传值 与 代理传值相似,主要用于第二个页面向第一个页面传值,block 传值具体步骤: 在第二个页面: 1.声明: block typedef void(^SendMessagerBlock) (NSString *str); 2.创建方法:

iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,

iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)

实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一下: 情况1:A页面跳转到B页面 方法: 在B页面的控制器中,编写对应的属性,在A页面跳转到B页面的地方,给B的属性赋值即可 //SecondViewController.h @property(nonatomic) NSInt

iOS Block界面反向传值

在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性.用维基百科的话来说,Block是Apple Inc.为C.C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包.关于闭包,一句话解释简洁明了:闭包就是能够读取其它函数内部变量的函数. 在iOS开发中,Block有很多方面的用途,

iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值: 1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性. 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一