51、[ iOS ] 7 种常见传值方法

1、AppDelegate传值

//--1、在 AppDelegate.h 中声明你要传值的类型,比如 NSString 类型。

    @property (nonatomic, strong) NSString *passValue;

//--2、在需要赋值的 UIViewController 中(比如 VC1 )导入 AppDelegate 头文件

    #import "AppDelegate.h"

//--3、然后赋值

    AppDelegate *app = [[UIApplication sharedApplication] delegate];
    app.passValue = @"AppDelegate赋值";

//--4、在最终传值的 UIViewController 中(比如 VC2 )导入 AppDelegate 头文件

    #import "AppDelegate.h"

//--5、然后将传过来的值在 VC2 中进行使用,实现将 VC1 中的值传到 VC2 中使用

    AppDelegate * app = [[UIApplication sharedApplication] delegate];
    NSLog(@"AppDelegate 传值--%@",app.passValue);

2、NSUserDefaults传值

NSUserDefaults 是以 key-value 的形式存储了一系列偏好设置,比如用户名、头像等等,key 是名称,value 是相应的数据。存数据时使用方法 setObject:forKey: 来把对象存储到相应的 plist 文件中,取数据时使用方法 objectForKey: 从 plist 文件中读取。因为是plist文件,所以存储的对象的类型必须是plist文件可以存储的类型:NSNumber(Integer、Float、Double)、NSDictionary、NSArray、NSDate、NSString、BOOL,如果想存不是如上几种的数据如图片,可以先转化为 NSData 再来存取。

//--1、在需要赋值的 UIViewController 中(比如 VC1 )直接赋值,比如 NSString 类型。

    NSUserDefaults *settings   = [NSUserDefaults standardUserDefaults];
    [setting setObject:@"NSUserDefaults存值" forKey:@"key值"];//这个key值是自定义的,取值就是根据这个key值来取,起标识作用
    [setting synchronize];//这句代码不能丢,同步作用

//--2、在最终传值的 UIViewController 中(比如 VC2 )使用

    NSUserDefaults *settings   = [NSUserDefaults standardUserDefaults];
    NSLog(@"NSUserDefaults 传值--%@",[setting objectForKey:@"key值"]);//和存值的key值保持一致

3、属性传值

属性传值一般多用于前一个界面向后一个界面传值

//--1、首先在后一个界面(比如 VC2 )的 .h 头文件中声明要传值的类型。比如 NSString类型

    @property (nonatomic,strong) NSString * passValue;

//--2、然后在前一个界面(比如 VC1 )的 .m 文件中导入 VC2 的头文件
    
    VC2 *vc2 = [[VC2 alloc] init];
    vc2.passValue = @"vc1要传到vc2的值";
    [self.navigationController pushViewController:vc2 animated:YES];

//--3、最后在 VC2 中使用

    NSLog(@"属性传值--%@",self.passValue);


4、单例传值

//--1、自定义一个单例类 SingleValueManager

//----------------------SingleValueManager.h 文件
#import <Foundation/Foundation.h>

@interface SingleValueManager : NSObject

@property (nonatomic ,strong) NSString *passValue;

+ (instancetype)defalutManager;
@end

//----------------------SingleValueManager.m 文件
#import "SingleValueManager.h"

@implementation SingleValueManager

+ (instancetype)defalutManager {

    static SingleValueManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        manager = [[SingleValueManager alloc] init];
        
    });
        return manager;
}
@end

//--------------------------------
//--2、在赋值的 VC 中导入单例类的头文件 #import "SingleValueManager.h" ,然后赋值

    SingleValueManager *manager = [SingleValueManager defalutManager];
    manager.passValue                  = @"要传到别的vc的值";    
    
//--3、在需要值的 VC 中导入单例类的头文件 #import "SingleValueManager.h" ,然后使用

    SingleValueManager * manager = [SingleValueManager defalutManager];
     NSLog(@"单例传值--%@",manager.passValue);

5、通知传值

一个程序内部只有一个 NSNotificationCenter 实例对象

//--1、注册通知,即要在什么地方接受消息

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(usePassValue:) name:NSNotificationName object:nil];

//--2、值使用

- (void)usePassValue:(NSNotification *)notify {
    
    NSDictionary * dic = notify.object;
    NSLog(@"通知传值--%@",[dic objectForKey:@"returnPassValue_key"]);
}

//--3、当使用完消息之后,不想在接收到消息,则需要把观察者移除,否则会出现错误

- (void)dealloc {
    
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"returnPassValue_name"object:nil];
}

//--4、发送通知:调用观察者处的方法,写在传值的VC

    NSDictionary * dic = [NSDictionary dictionaryWithObject:@"通知广播发射的消息" forKey:@"returnPassValue_key"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"returnPassValue_name" object:dic];

6、Block传值

Block传值一般多用于后一个界面向前一个界面传值,使用 block 需要注意循环引用问题
__weak typeof(self) weakSelf = self;

//--1、首先在后一个界面(比如 VC2 )的 .h 头文件中 声明block

    @property (nonatomic, copy) void(^returnPassValue)(NSString * passValue);

//--2、然后在后一个界面(比如 VC2 )的 .m 文件中 实现block回调传值

    //--block回调传值
    if (self.returnPassValue) {
        
        self.returnPassValue(@"vc2要传到vc1的值");
    }

//--3、最后在前一个界面(比如 VC1 )的 .m 文件中导入 VC2 的头文件,实现回调
    
    VC2 *vc2 = [[VC2 alloc] init];
    vc2.returnPassValue = ^(NSString * passValue) {
             NSLog(@"block传值--%@",passValue);
     };


7、代理传值

代理传值一般多用于后一个界面向前一个界面传值

//--1、首先在后一个界面(比如 VC2 )的 .h 头文件中

#import <UIKit/UIKit.h>
  //声明协议
@protocol passValueDelegate <NSObject>
  //协议方法   
- (void)returnPassValue:(NSString *)passValue;
@end

@interface VC2 : UIViewController
  //声明代理属性
@property (nonatomic,assign) id<passValueDelegate>delegate;

@end

//--2、然后在后一个界面(比如 VC2 )的 .m 文件中 实现代理回调传值

    if ([self.delegate conformsToProtocol:@protocol(passValueDelegate)] && [self.delegate respondsToSelector:@selector(returnPassValue:)]) {
         [self.delegate returnPassValue:@"vc2要传到vc1的值"];
    }

//--3、然后在前一个界面(比如 VC1 )的 .m 文件中导入 VC2 的头文件,实现<passValueDelegate>,拿到代理,实现协议方法

    VC2 *vc2 = [[VC2 alloc] init];
    //拿到代理,下面这句必须要写在vc1向vc2的跳转的部分
    vc2.delegate = self;
    [self.navigationController pushViewController:vc2 animated:YES];

    //协议方法实现
    - (void)returnPassValue:(NSString *)passValue {
      
         NSLog(@"代理传值--%@",passValue);
   }

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

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • http://www.devstore.cn/essay/essayInfo/6525.html【原文地址】 序言...
    起名好难_fz阅读 633评论 1 1
  • 1.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令伟阅读 1,042评论 0 10
  • 转自 iOS 面试常见问题最全梳理 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找...
    ZMJun阅读 788评论 0 11
  • 不知不觉中,又到了好报写作群结营的日子。这是我在好报参加的第十期写作群。当然,这一期我依然保持了全勤打卡的记录。 ...
    小坏蛋格瑞特阅读 197评论 2 4