美文网首页
协议传值,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 传值,通知中心

    协议传值六个步骤: 第一步:在第二个页面的.h文件中声明一个协议,并且声明一个协议方法 第二步:添加代理人属性,在...

  • UI总结-界面传值

    UI总结-界面传值(属性传值,协议传值,block传值,通知中指传值) 在编程过程中,界面传值是很重要的一部分,常...

  • iOS中2种正向传值,6种反向传值方式归纳总结

    1、属性传值 前向后传值。2、协议传值3、Block传值 代替协议代理传值,主要时间点问题。4、单...

  • Block传值

    iOS传值一共有四种:属性传值,代理传值,通知传值以及Block传值; 今天我们来说一下Block传值: 概念:带...

  • iOS 传值的方式的区别

    1.属性传值。 2.block传值。 3.代理传值(delegate) 4.通知传值(notification)。...

  • iOS_UI_08_界面通信

    第八章 界面通信 一、属性传值 二、协议传值 三、Block传值

  • iOS的五种传值

    前言 iOS常见的五种传值分别为属性传值,通知传值,代理传值,block传值,单例传值 属性传值 用于正向传值,简...

  • 界面传值ios

    一.通知传值 NSNotification //捕获通知 二. block传值 1.声明一个block变量 2.实...

  • iOS 常用传值方式

    总结 iOS 日常开发中的几种常用传值方式:正向传值代理传值block传值通知传值单例 文章代码:https://...

  • iOS 传值方式

    1,从前向后传值:属性传值 2, 从后向前传值: block、 代理、 通知 结论1, block、 代理 传值用...

网友评论

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

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