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

过程:有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];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,719评论 30 472
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,267评论 0 7
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,850评论 0 4
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,145评论 0 12
  • 经好友推荐注册的这个账号,当时还是个懵懵懂懂的学生。转眼已经两年多了,却只字未落,内心忍不住再次感叹时光的...
    栀简阅读 383评论 0 1

友情链接更多精彩内容