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);
}
网友评论