美文网首页
协议传值,block 传值,通知中心

协议传值,block 传值,通知中心

作者: 奋斗的小老鼠 | 来源:发表于2016-05-05 23:05 被阅读205次

    协议传值六个步骤:

    第一步:在第二个页面的.h文件中声明一个协议,并且声明一个协议方法
    #pragma mark- 制定协议第一步:声明一个协议,并且声明一个协议方法
    //协议命名规范:类名 + Delegate
    @protocol SecondViewControllerDelegate <NSObject>
    //传值的内容作为协议方法参数
    -(void)passSting:(NSString *)string;
    @end
    
    第二步:添加代理人属性,在.文件的@interface 中声明一个属性,让外部能够访问到
    #pragma mark-- 协议传值第二步:添加代理人属性
    @interface SecondViewController : UIViewController
    @property(nonatomic,weak)id<SecondViewControllerDelegate>delegate;
    @end
    
    第三步:让代理人执行传值的协议方法,一般写在返回到上个页面的方法中,为了安全起见,我们需要判断代理人存在,且相应该协议方法
    //跳转到上一个页面的方法
    - (void)backBarButtonItem:(UIBarButtonItem *)sender {
    #pragma mark-- 协议传值第三步,让代理人执行传值的协议方法
        //代理人存在且响应协议的方法
        if (self.delegate && [self.delegate respondsToSelector:@selector(passSting:)]) {
            [self.delegate passSting:self.textField.text];
        }
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    第四步:在第一个页面签订协议
    #pragma mark--协议传值第四步:签订我们声明协议
    @interface RootViewController ()<SecondViewControllerDelegate>
    
    第五步:指定代理人,谁声明的协议谁来指定代理人
    //这个是SecondViewController的协议,需要他来指定代理人
    - (void)buttonAction:(UIButton *)button {
        SecondViewController *secondVC = [[SecondViewController alloc] init];
    #pragma mark--协议传值第五步:指定代理人
        secondVC.delegate = self;
        [self.navigationController pushViewController:secondVC animated:YES];
    }
    
    第六步:实现协议方法
    #pragma mark--协议传值第六步:实现协议方法
    -(void)passSting:(NSString *)string {
        self.label.text = string;
    }
    

    协议传值到此就结束了,本文如有错误,欢迎交流,需要此Demo,请点击下载http://pan.baidu.com/s/1o8tN7cu

    block传值

    block 语法格式

         返回值类型 (^block变量名)(参数列表) = ^(参数列表){
            返回值
         };
        //1.无参无返回值的block
        void(^block1)(void) = ^(void){
            NSLog(@"呵呵");
        };
        block1();
        //2.有参有反
        int (^block2)(int a,int b) = ^(int a,int b){
            return a + b;
        };
        int sum =  block2(1,2);
        NSLog(@"%d",sum);
        //在block里面使用局部变量
        //在block中使用局部不变本量,当代吗执行到block的定义时,虽没有执行block中的代码,但是系统会自动开辟一块空间,将局部变量的值拷贝一份存进去,也就是说,block中的局部变量和之前定义的局部变量不是同一个变量
        __block int aa = 10;
        void (^testBlock)(void) = ^(void) {
            NSLog(@"aa = %d %p",aa,&aa);
        };
        aa = 100;
        NSLog(@"%d %p",aa,&aa);
        testBlock();
    

    block 传值三个步骤

    第一步:声明block 类型的属性
    #pragma mark--block传值第一步:在第二个页面的 .h 文件声明block类型的属性
    @property(nonatomic,copy)void(^block)(NSString *str);
    
    第二步:调用传值的时候调用block,在返回上个页面的时候进行传值
    - (void)backBarButtonItem:(UIBarButtonItem *)sender {
    #pragma mack--传值第二步:调用传值的时候调用block
        self.block(self.textField.text);
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    第三步:实现 block 在第一个页面
    - (void)buttonAction:(UIButton *)button {
        SecondViewController *secondVC = [[SecondViewController alloc] init];
    #pragma mark--传值第三步:实现block
        //ARC下用__weak    MRC下用__block;
        __weak RootViewController *rootVC = self;
        secondVC.block = ^(NSString *str){
            rootVC.label.text = str;
        };
        [self.navigationController pushViewController:secondVC animated:YES];
    }
    

    Demo下载链接 http://pan.baidu.com/s/1dF0l6TF

    iOS 通知中心(NSNotificationCenter)

    在这里第一步和第二步的顺序可以互换,一般楼主我喜欢先在需要发送消息的页面发送消息,然后再在需要监听的页面注册监听。

    第一步:注册观察者
    /**
     *      观察者注册消息通知
     *
     *      @param addObserver 观察者  self
     *
     *      @param selector 回调方法  notification
     *
     *      @param name 消息的名称  notifitionMassage
     *
     *      @param object 发送消息的对象,表示接收哪个发送者的通知,如果第四个参数为nil,则接收所有发送者的通知。
     */
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notification:)
                                                name:@"notifitionMassage" object:nil];
    
    第二步:发送消息通知
    /**
     *      发送消息通知
     *
     *      @param postNotificationName 发送消息的名称  notifitionMassage 这里一定要和观察者中消息的名称一致,否则监测不到消息
     *
     *      @param object 发送消息的对象  如果这里填nil,而且观察者要监测同时监测了好几个消息,但是这里我们只需要这一条特定的消息的时候,此时就无法达到我们想要的
     *                    结果了。
     */
    [[NSNotificationCenter defaultCenter]postNotificationName:@"notifitionMassage" object:nil];
    
    第三步:观察者处理消息(这个方法也就是观察者的回调方法)
    /**
     *      观察者处理消息(这个方法也就是观察者的回调方法)
     *
     *      @param massage 接收到消息的信息,主要用于传值。(里面包含了Name:消息的名称 object:消息的发送者 userInfo:消息传递的数据信息)
     */
    -(void)notification:(NSNotification *)massage{
        //在这里做我们想要的操作
    }
    
    第四步:注销观察者

    a.最好的办法就是在注册观察者的页面的dealloc方法中去移除观察者

    -(void)dealloc{
        /**
         *      移除观察者的方法
         *
         *      @param removeObserver 监听的对象  self
         *
         *      @param name  消息的名称
         *
         *      @param object 发送消息的对象  如果发送消息的时候填写了对象,那么这里就是那个对象
         */
        [[NSNotificationCenter defaultCenter]removeObserver:self];
    }
    

    b.单个移除

    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"notifitionMassage" object:nil];
    

    相关文章

      网友评论

          本文标题:协议传值,block 传值,通知中心

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