iOS 传值的方式的区别

1.属性传值。

2.block传值。

3.代理传值(delegate)

4.通知传值(notification)。

5.单例传值。

属性传值:

场景:A页面跳转到B页面。正向传值

关系:一对一;

·两个页面定义的属性类型是要一致的。

代码:

UIViewController *B = [UIViewController new];

B.title = @"B的标题";

[A.navigationController pushViewController:B animated:YES];

block传值:


关系:一对一;

使用场景:

常用于回调,简单的说就是B有一个按钮,当按钮被点击时把点击事件传传给A,并传一个字符串"B被点了"。


代码:

//首先在B控制器中声明一个block,参数是一个字符串

@property (nonatomic,copy) void(^block)(NSString *title);

//同样在B控制器,在按钮点击触发的方法里执行block

- (void)buttonClick:(UIButton *)sender

{

self.block(@"B被点了");

}

//现在回到A控制器,在推出B的时候给B的block赋值,简单的说,就是在收到B的消息时,想要做什么事

BController *B = [BController new];

B.block = ^(NSString *title) {

//do someThing

A.title = title;

};

[A.navigationController pushViewController:B animated:YES];

同样的Block在这里作为属性存在,同属性传值一样,需要两个控制器间具有一定关联性。不能跨页面传值。

如果一定要跨,就要像接力赛一样,A传给B,B传给C这样

代理传值:

场景:A页面跳转到B页面,B页面再返回A页面。逆向传值

关系:一对一;

代码:

//首先,在B里定义个协议并声明一个代理

@protocol B_ButtonClickDelegate

- (void)B_ButtonIsClicked:(NSString *)message;

@end

@interface BController : UIViewController

@property (nonatomic,assign) iddelegate;

@end

//B控制器,点击事件发生时让代理去执行代理方法

- (void)buttonClick:(UIButton *)sender

{    [self.delegate B_ButtonIsClicked:@"B的按钮被点了谁来管管"];}

//推出B之前,让A成为B的代理

BController *B = [BController new];

B.delegate = A;

[A.navigationController pushViewController:B animated:YES];

//最后A遵守协议并实现对应代理方法

@interface AController ()

- (void)B_ButtonIsClicked:(NSString *)message

{

self.title = message;

}

区别:

代理传值和block传值相似,都是将事件分发出去。但是与block的不同在于,代理具有松耦合性,谁想处理事件成为代理即可。

通知中心传值:

关系:一对多;

代码:

//在需要处理事件的控制器的初始化方法里订阅通知,注意,一定是先订阅

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealAction:) name:@"B的按钮被点了大家响应下" object:nil];

//收到通知后执行什么事?实现**dealAction:**即可

- (void)dealAction:(NSNotification *)sender

{

//这里的object就是发出通知时附带

NSLog(@"%@",sender.object);

//打印结果--"哈萨克"

}

//在B控制器需要处理事件的时候发出通知

- (void)buttonClick:(UIButton *)sender

{

[[NSNotificationCenter defaultCenter] postNotificationName:@"B的按钮被点了大家响应下" object:@[@"哈萨克"]];

}

单例传值:

iOS系统中常间的单例模式莫过于UIApplication、 NSNotificationCenter、 NSUserDefaults

如何创建单例这里不做说明,以NSUserDefaults为例说下具体使用

代码:

//以键值对的形式存值到NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:@"哈萨克" forKey:@"亚索"];

//从NSUserDefaults取出

NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"亚索"];

NSLog(@"%@",value); //打印结果--"哈萨克"

区别:

代理是一种回调机制,且是一对一的关系,通知是一对多的关系,一个对向所有的观察者提供变更通知;

效率:Delegate比NSNOtification高;

Delegate和Block一般是一对一的通信;

Delegate需要定义协议方法,代理对象实现协议方法,并且需要建立代理关系才可以实现通信;

Block:Block更加简洁,不需要定义繁琐的协议方法,但通信事件比较多的话,建议使用Delegate;

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

推荐阅读更多精彩内容

  • iOS开发中,页面传值是很常见的,但是页面传值你究竟知道多少呢?笔者这篇文章就是给大家介绍一下页面传值的具体方式,...
    蒲公英少年阅读 2,138评论 10 44
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 1.正向传值 属性传值在B类中定义属性用于接收A类传来的数据 2.反向传值(回调) 1)利用对象反向传值 将A类对...
    ScaryMonsterLyn阅读 1,317评论 0 0
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,342评论 2 4
  • 因为我自己本身是那种超短发,但是这几天非常想拥有长发,但是我的头发又不能去摸激素让它快速生长,所以只能画画长发少女...
    斋忧_阅读 204评论 0 2