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 中進行使用鲜结,實現(xiàn)將 VC1 中的值傳到 VC2 中使用
AppDelegate * app = [[UIApplication sharedApplication] delegate];
NSLog(@"AppDelegate 傳值--%@",app.passValue);
2展运、NSUserDefaults傳值
NSUserDefaults 是以 key-value 的形式存儲了一系列偏好設(shè)置,比如用戶名精刷、頭像等等拗胜,key 是名稱,value 是相應(yīng)的數(shù)據(jù)怒允。存數(shù)據(jù)時使用方法 setObject:forKey: 來把對象存儲到相應(yīng)的 plist 文件中埂软,取數(shù)據(jù)時使用方法 objectForKey: 從 plist 文件中讀取。因為是plist文件纫事,所以存儲的對象的類型必須是plist文件可以存儲的類型:NSNumber(Integer勘畔、Float所灸、Double)、NSDictionary炫七、NSArray爬立、NSDate、NSString万哪、BOOL侠驯,如果想存不是如上幾種的數(shù)據(jù)如圖片,可以先轉(zhuǎn)化為 NSData 再來存取奕巍。
//--1吟策、在需要賦值的 UIViewController 中(比如 VC1 )直接賦值,比如 NSString 類型伍绳。
NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
[setting setObject:@"NSUserDefaults存值" forKey:@"key值"];//這個key值是自定義的踊挠,取值就是根據(jù)這個key值來取,起標識作用
[setting synchronize];//這句代碼不能丟冲杀,同步作用
//--2效床、在最終傳值的 UIViewController 中(比如 VC2 )使用
NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
NSLog(@"NSUserDefaults 傳值--%@",[setting objectForKey:@"key值"]);//和存值的key值保持一致
3、屬性傳值
屬性傳值一般多用于前一個界面向后一個界面?zhèn)髦?/p>
//--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担租、通知傳值
一個程序內(nèi)部只有一個 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、當使用完消息之后反惕,不想在接收到消息尝艘,則需要把觀察者移除,否則會出現(xiàn)錯誤
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"returnPassValue_name"object:nil];
}
//--4姿染、發(fā)送通知:調(diào)用觀察者處的方法背亥,寫在傳值的VC
NSDictionary * dic = [NSDictionary dictionaryWithObject:@"通知廣播發(fā)射的消息" forKey:@"returnPassValue_key"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"returnPassValue_name" object:dic];
6、Block傳值
Block傳值一般多用于后一個界面向前一個界面?zhèn)髦担褂?block 需要注意循環(huán)引用問題
__weak typeof(self) weakSelf = self;
//--1隘梨、首先在后一個界面(比如 VC2 )的 .h 頭文件中 聲明block
@property (nonatomic, copy) void(^returnPassValue)(NSString * passValue);
//--2程癌、然后在后一個界面(比如 VC2 )的 .m 文件中 實現(xiàn)block回調(diào)傳值
//--block回調(diào)傳值
if (self.returnPassValue) {
self.returnPassValue(@"vc2要傳到vc1的值");
}
//--3、最后在前一個界面(比如 VC1 )的 .m 文件中導入 VC2 的頭文件轴猎,實現(xiàn)回調(diào)
VC2 *vc2 = [[VC2 alloc] init];
vc2.returnPassValue = ^(NSString * passValue) {
NSLog(@"block傳值--%@",passValue);
};
7嵌莉、代理傳值
代理傳值一般多用于后一個界面向前一個界面?zhèn)髦?/p>
//--1、首先在后一個界面(比如 VC2 )的 .h 頭文件中
#import <UIKit/UIKit.h>
//聲明協(xié)議
@protocol passValueDelegate <NSObject>
//協(xié)議方法
- (void)returnPassValue:(NSString *)passValue;
@end
@interface VC2 : UIViewController
//聲明代理屬性
@property (nonatomic,assign) id<passValueDelegate>delegate;
@end
//--2捻脖、然后在后一個界面(比如 VC2 )的 .m 文件中 實現(xiàn)代理回調(diào)傳值
if ([self.delegate conformsToProtocol:@protocol(passValueDelegate)] && [self.delegate respondsToSelector:@selector(returnPassValue:)]) {
[self.delegate returnPassValue:@"vc2要傳到vc1的值"];
}
//--3锐峭、然后在前一個界面(比如 VC1 )的 .m 文件中導入 VC2 的頭文件,實現(xiàn)<passValueDelegate>可婶,拿到代理沿癞,實現(xiàn)協(xié)議方法
VC2 *vc2 = [[VC2 alloc] init];
//拿到代理,下面這句必須要寫在vc1向vc2的跳轉(zhuǎn)的部分
vc2.delegate = self;
[self.navigationController pushViewController:vc2 animated:YES];
//協(xié)議方法實現(xiàn)
- (void)returnPassValue:(NSString *)passValue {
NSLog(@"代理傳值--%@",passValue);
}