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

协议传值六个步骤:

第一步:在第二个页面的.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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容