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

作者: 天听云道 | 来源:发表于2016-07-29 18:42 被阅读323次

    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);
       }
    

    相关文章

      网友评论

      • 73d90af49c95:有许多重复了吧? 属性算是一种,回调的代理和block算是一种!单例算是一种!通知,NSUserDefaults都算是单例的!
        天听云道:@iutuyte 是的。
      • 有生之莲花:可以写完的啊!每一种都给一个简单易懂的demo帮助很大的!希望作者可以补完!
        天听云道:@灭天瞳 👌

      本文标题:51、[ iOS ] 7 种常见传值方法

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