程序员iOS Developer

5分钟学会Block和Delegate反向传值

2017-04-05  本文已影响91人  尼古拉斯超仔

过程:有A和B控制器,A先跳转到B,然后B传值给A。

一、Block

1.首先在B控制器的.h文件中定义一个没有返回值,参数类型为NSString的block属性。
@property (copy, nonatomic)void(^block)(NSString *str);

2.在A控制器中,给B控制器的block属性进行赋值。

//A跳转B
- (void)push{
    BViewController *vc = [[BViewController alloc]init];
    vc.block = ^void(NSString *str){
    //这里就可以拿到B控制器传递过来的值
        NSLog(@"%@",str);
    };
    [self.navigationController pushViewController:vc animated:true];
}

3.在B控制器回跳到A的方法中调用block,调用block之前最好先判断block是否为空,不为空才调用,否则程序崩溃。

//B回跳A
- (void)pop{
    //装逼写法
    //!self.block? : self.block(@"回调");
    //一般写法
    if (self.block) {
        self.block(@"回调");
    }
    [self.navigationController popViewControllerAnimated:YES];
}

二、Delegate

1.首先在B的.h文件中声明协议和协议方法。

@protocol BViewControllerDelegate <NSObject>

- (void)myDelegate:(NSString *)str;

@end

2.在B的.h中声明一个协议属性,这里要注意用assign或weak修饰,
weak和assign是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。所以,似乎用weak更安全些。

@property (assign,nonatomic)id<BViewControllerDelegate>delegate;

3.在A的.m中,导入B控制器,实现B里的delegate,并实现delegate的方法。

#import "BViewController.h"
@interface AViewController ()<BViewControllerDelegate>

@end

//BViewControllerDelegate的方法
- (void)myDelegate:(NSString *)str{
    //在这里拿到B传过来的值
    NSLog(@"%@",str);
}

4.在A的.m中,在push到B界面的push方法之前,B对象的初始化之后,指定A对象为B对象的代理。

//A跳转B
- (void)push{
    BViewController *vc = [[BViewController alloc]init];
    vc.delegate = self;
    [self.navigationController pushViewController:vc animated:true];
}

5.在B的.m中,在pop方法里,判断在指定的代理类中是否实现了该协议方法,[self.delegate 协议方法名称:(参数,也就是要传回的数据) ],确保执行时无此方法时不崩溃 。

//B回跳A
- (void)pop{
  //装逼写法
//    ![self.delegate respondsToSelector:@selector(myDelegate:)]? : [self.delegate myDelegate:@"回调"];
  //一般写法
  if ([self.delegate respondsToSelector:@selector(myDelegate:)]) {
      [self.delegate myDelegate:@"回调"];
  }
  [self.navigationController popViewControllerAnimated:YES];
}

上一篇下一篇

猜你喜欢

热点阅读