美文网首页程序员iOS Developer
5分钟学会Block和Delegate反向传值

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

作者: 尼古拉斯超仔 | 来源:发表于2017-04-05 13:42 被阅读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];
    }
    
    

    相关文章

      网友评论

        本文标题:5分钟学会Block和Delegate反向传值

        本文链接:https://www.haomeiwen.com/subject/oyutattx.html