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

相关文章

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

    1、AppDelegate传值 2、NSUserDefaults传值 NSUserDefaults 是以 key-...

  • iOS的五种传值

    前言 iOS常见的五种传值分别为属性传值,通知传值,代理传值,block传值,单例传值 属性传值 用于正向传值,简...

  • iOS反向传值整理

    本文主要讲解iOS中常见的反向传值方法。 1.AppDelegate传值 在AppDelegate中定义相关的属性...

  • iOS传值

    iOS传值方式 1.比较基础的一种是初始化的方法传值, initWith+参数 2.属性传值 if(_opinio...

  • h5与安卓,ios交互

    调用ios方法并传值 1、首先判断是不是ios手机 2、将ios方法进行封装并在页面调用传值即可 ios调用h5的...

  • iOS中的传值方式

    在日常开发过程中,我们经常会遇到值传递。这里,介绍几种iOS开发中常见的传值方式。 1.属性传值 属性传值是iOS...

  • iOS传值方式

    在iOS中,常见的传值方式有以下几种:1.属性传值2.单例传值3.通知传值4.代理传值5.Block这些传值方式,...

  • iOS 传值方法(属性传值、代理传值、Block、通知、单例)

    iOS 传值方法(属性传值、代理传值、Block、通知、单例)简单的介绍一下几个传值方式 1、属性传值 在传值的时...

  • iOS页面间传值详解(二)

    在iOS页面间传值详解(一)中,介绍了iOS界面间的正向传值以及逆向传值的两种方法,其实逆向传值还可以使用bloc...

  • iOS 通知

    iOS 通知传参使用方法 尽量不要在viewWillDisappear:方法中移除通知 iOS通知传值的使用 1、...

网友评论

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

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

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