关闭

block在俩个UIViewController间传值

标签: IOSUIblock
575人阅读 评论(0) 收藏 举报
分类:

最近刚学了几招block 的高级用法,其实就是利用block语法在俩个UIViewController之间传值,在这里分享给初学者,同时也方便我自己理解。我们知道UINavigationController类管理UIViewController的时候,利用的是“栈”的思想,在这里不做过多解释,切入正题,假设我们现在有俩个UIViewController,viewC1和viewC2,viewC1比viewC2先进入到UINavigationController里,即viewC2是由viewC1push出来的, 这里的传值是指将viewC2的值传到viewC1里面 。例如通讯录的修改,微信里修改信息等。 

不多说,直接上例子: 

一.首先在viewC2的头文件中的代码: 

//1 。重定义一个block类型
typedef void(^BL)(UIColor *color);
typedef void(^stringBL)(NSString *string);
@interface SecondViewController : UIViewController
//定义一个block属性 一定要使用copy特性  原因:
@property (nonatomic, copy) BL block;
@property (nonatomic, copy) stringBL string;
- (void)valueBlock:(BL)block;
- (void)valueStringBlock:(stringBL)block;

提示:

重定义block在Xcode中有快捷实现方式,直接在@interfacexxx 上面一行打typedef会有提示:  直接回车,第一个参数是返回值类型,第二个为重定义的block名称,第三个为要传参数类型和参数名;然后需要定义重定义block类型的属性,并且实现参数为该重定义类型block的方法。 

二.viewC2的.m文件中代码:

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view.
  UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
  button.frame = CGRectMake(0, 70, 320, 40);
  [self.view addSubview:button];
  [button setTitle:@"return 1 page" forState:UIControlStateNormal];
  [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonAction:(UIButton *)button
{
//	2.在合适的地方执行block代码
  self.block([UIColor redColor]);
  self.string(@"asdasdasd");
  [self.navigationController popToRootViewControllerAnimated:YES];
}
- (void)valueBlock:(BL)block
{
  self.block = block;
}
- (void)valueStringBlock:(stringBL)block
{
  self.string = block;
}

解释:实现头文件中定义的方法,方法内部写将参数赋值给重定义block的属性,然后在合适的地方执行block代码,block里面的参数即你要传的值。

三.在viewC1中push第二个页面的时候调用 viewC2的方法,直接回车,block重定义中的参数名里存的即是要在viewC1中修改的值。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:60195次
    • 积分:966
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:64篇
    • 译文:6篇
    • 评论:4条
    最新评论