iOS开发技术讨论swift编程开发iOS开发知识小集

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

2016-07-29  本文已影响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);
   }

上一篇 下一篇

猜你喜欢

热点阅读