首先我們?cè)O(shè)定一個(gè)場(chǎng)景(大家可以以此類(lèi)推得到自己想要的結(jié)果)假設(shè)初始化頁(yè)面為登錄界面(ViewController)瓷产,按鈕分為登錄(登錄后界面ZQMainVC)以及注冊(cè)(ZQResignVC)筹淫,現(xiàn)在我們想注冊(cè)以后返回到登錄界面自動(dòng)填寫(xiě)上我注冊(cè)信息——賬號(hào)和密碼动猬,同理在登錄成功以后主界面同樣顯示賬號(hào)和密碼笨枯。廢話(huà)少說(shuō)览祖,進(jìn)入正題膳殷。
1.屬性傳值
屬性傳值顧名思義膨疏,通過(guò)申明屬性直接傳值别智,一般來(lái)說(shuō)正向傳值宗苍,一對(duì)一傳值。現(xiàn)在我們就完成前提中的一個(gè)功能薄榛,登錄傳值到首頁(yè)讳窟。具體操作如下:
ViewController.m
ZQMainVC*mainVC=[[ZQMainVCalloc]init];
mainVC.userName=_userNameText.text;
mainVC.passWord=_passWordText.text;
[self.navigationControllerpushViewController:mainVCanimated:YES];
2.初始化傳值
初始化傳值表示在頁(yè)面初始化的時(shí)候重寫(xiě)初始化方法進(jìn)行傳值,一對(duì)一傳值敞恋。方法比較簡(jiǎn)單丽啡,操作如下:
ZQMainVC.h
-(id)initWithUserName:(NSString*)userName WithPassWord:(NSString*)passWord ;
ZQMainVC.m
-(id)initWithUserName:(NSString*)userName WithPassWord:(NSString*)passWord {
self= [superinit];
if(self) {
// Custom initialization
_passWord=passWord;
_userName=userName;
}
returnself;
}
在 ViewController.m中
ZQMainVC*mainVC= [[ZQMainVCalloc]initWithUserName:_userNameText.textWithPassWord:_passWordText.text];
[self.navigationControllerpushViewController:mainVCanimated:YES];
3.NSuserDefault傳值
NSUserDefaults可以存取一些短小的信息,但是并不是所有的東西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary(不可變數(shù)據(jù)) 硬猫,支持一傳多补箍,具體傳值如下:
ViewController.m
[[NSUserDefaultsstandardUserDefaults]setValue:_userNameText.textforKey:@"UserId"];
[[NSUserDefaultsstandardUserDefaults]setValue:_passWordText.textforKey:@"PassWord"];
//將緩存中的數(shù)據(jù)強(qiáng)制寫(xiě)入磁盤(pán)
[[NSUserDefaultsstandardUserDefaults]synchronize];
ZQMainVC*mainVC=[[ZQMainVCalloc]init];
[self.navigationControllerpushViewController:mainVCanimated:YES];
ZQMainVC.m
self.userName=[[NSUserDefaultsstandardUserDefaults]objectForKey:@"UserId"];
self.passWord=[[NSUserDefaultsstandardUserDefaults]objectForKey:@"PassWord"];
4.通知傳值
通知可以通過(guò)通知中心廣播通知改执,支持一傳多。但是要注意傳值的時(shí)候應(yīng)該頁(yè)面已經(jīng)加載完畢坑雅,現(xiàn)在我們?cè)谧?cè)界面填寫(xiě)信息辈挂,返回登錄界面時(shí)候自動(dòng)填寫(xiě)賬號(hào)密碼,具體操作如下:
ZQResignVC.m
NSArray*array=[[NSArrayalloc]initWithObjects:_userNameText.text,_passWordText.text,nil];
//發(fā)送通知sendMessage表示通知詳情array表示傳輸數(shù)據(jù)
[[NSNotificationCenterdefaultCenter]postNotificationName:@"ZQSendMessage"object:array];
在ViewController.m中
ViewController.m
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(getZQMessage:)name:@"ZQSendMessage"object:nil];
-(void)getZQMessage:(NSNotification*)notification{
NSArray*array=[[NSArrayalloc]initWithArray:notification.object];
_userName=array[0];
_passWord=array[1];
}
5.單例傳值
單例傳值裹粤,申明一個(gè)model類(lèi)別 终蒂,申明一個(gè)model的數(shù)據(jù)。單例不會(huì)不會(huì)被消除自然屬性值還在遥诉。具體如下:
ZQShareManager.h
@property(copy,nonatomic)NSString*userName;
@property(copy,nonatomic)NSString*password;
//申明一個(gè)單例方法
+ (ZQShareManager*)shareUserInfo;
ZQShareManager.m
+ (ZQShareManager*)shareUserInfo{
staticZQShareManager*shareManager =nil;
staticdispatch_once_tpredicate;
dispatch_once(&predicate, ^{
shareManager = [[selfalloc]init];
});
returnshareManager;
}
在ZQResignVC.m 中
ZQResignVC.m
-(void)buttonClick:(UIButton*)button{
[selftextResignFirstResponder];
//反向傳值
ZQShareManager*shareManager = [ZQShareManagershareUserInfo];
shareManager.userName=_userNameText.text;
shareManager.password=_passWordText.text;
[self.navigationControllerpopToRootViewControllerAnimated:YES];
}
在ViewController.m中
ViewController.m
- (void)viewDidAppear:(BOOL)animated
{
[superviewDidAppear:animated];
//申明初始化單例類(lèi)的對(duì)象
ZQShareManager*shareManager = [ZQShareManagershareUserInfo];
_userNameText.text= shareManager.userName;
_passWordText.text= shareManager.password;
}
6. AppDelegate傳值
類(lèi)似于單例傳值,可以雙向傳值后豫,支持一傳多。具體如下
1突那、在AppDelegate類(lèi)中定義一個(gè)接收傳值的屬性挫酿,例如:需要接收的屬性為NSMutableArray類(lèi)型。
@property(nonatomic, strong) NSArray *dataArray;
2愕难、在其他類(lèi)中定義一個(gè)AppDelegate的屬性:
@property(nonatomic, strong) AppDelegate *appDelegate;
3早龟、然后在類(lèi)中初始化:
_appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
4、進(jìn)行賦值操作
_appDelegate.dataArray=dataArray;
7.代理傳值
代理傳值是目前比較常用的傳值猫缭,通過(guò)掛代理代理方法進(jìn)行傳值和后續(xù)操作葱弟。比較靈活,雙向傳遞猜丹,只能一傳一芝加。具體操作如下:
ZQResignVC.h
申明代理方法
@protocolZQResignVCDelegate
-(void)sendMessage:(NSString*)userName withPassword: (NSString*)password;
@end
@interfaceZQResignVC :UIViewController
@property(nonatomic,assign)id delegate;
@end
在ZQResignVC.m中
ZQResignVC.m
//傳值
-(void)buttonClick:(UIButton*)button{
[selftextResignFirstResponder];
if(self.delegate&& [self.delegaterespondsToSelector:@selector(sendMessage:withPassword:)]) {
[self.delegatesendMessage:_userNameText.textwithPassword:_passWordText.text];
}
[self.navigationControllerpopToRootViewControllerAnimated:YES];
}
在 ViewController.h 中
ViewController.h
正向傳值到主界面
@protocolViewControllerDelegate
-(void)ViewControllerSendMessage:(NSString*)userName withPassword:(NSString*)password;
@end
@interfaceViewController :UIViewController
@property(nonatomic,assign)iddelegate;
ViewController.h
//掛代理
-(void)buttonClick:(UIButton*)button{
[selftextResignFirstResponder];
if([button.titleLabel.textisEqualToString:@"注冊(cè)"]) {
NSLog(@"注冊(cè)");
ZQResignVC*resignVC=[[ZQResignVCalloc]init];
//掛代理
resignVC.delegate=self;
[self.navigationControllerpushViewController:resignVCanimated:YES];
}
if([button.titleLabel.textisEqualToString:@"登錄"]) {
NSLog(@"登錄");
//反向傳值
ZQMainVC*mainVC=[[ZQMainVCalloc]init];
self.delegate=mainVC;
if(self.delegate&& [self.delegaterespondsToSelector:@selector(ViewControllerSendMessage:withPassword:)]) {
[self.delegateViewControllerSendMessage:_userNameText.textwithPassword:_passWordText.text];
}
[self.navigationControllerpushViewController:mainVCanimated:YES];
}
}
//實(shí)現(xiàn)代理方法
#pragma mark ZQResignVCDelegate
-(void)sendMessage:(NSString*)userName withPassword:(NSString*)password{
_passWordText.text=password;
_userNameText.text=userName;
}
注意在實(shí)現(xiàn)代理方法前均要掛上代理。否則無(wú)效應(yīng)射窒。同理在ZQMainVC.h中也要掛代理實(shí)現(xiàn)代理方法藏杖。在這里不在累贅÷龆伲可以從demo中查看方法
8.block傳值
block是一種比較抽象的傳值方法(代碼塊)蝌麸,使用頻率也是很高。一般用來(lái)實(shí)現(xiàn)反向傳值艾疟,支持一對(duì)一傳值来吩,具體操作如下:
// ZQResignVC.h
#import
// block格式:返回值(^block名字)(參數(shù))
// (1)定義block
typedefvoid(^myBlcok)(NSArray*array);
@interfaceZQResignVC :UIViewController
// (2)申明block屬性
@property(strong,nonatomic)myBlcokblock;
-(void)sendMessage:(myBlcok)block;
@end
ZQResignVC.m
-(void)buttonClick:(UIButton*)button{
[selftextResignFirstResponder];
NSArray*array=[[NSArrayalloc]initWithObjects:_userNameText.text,_passWordText.text,nil];
if(self.block)
{
self.block(array);
}
[self.navigationControllerpopToRootViewControllerAnimated:YES];
}
//注意self.block=block; 等于兩端順序不能改變
-(void)sendMessage:(myBlcok)block{
self.block=block;
}
在 ViewController.h 中
ViewController.h
-(void)buttonClick:(UIButton*)button{
[selftextResignFirstResponder];
if([button.titleLabel.textisEqualToString:@"注冊(cè)"]) {
NSLog(@"注冊(cè)");
ZQResignVC*resignVC=[[ZQResignVCalloc]init];
[resignVCsendMessage:^(NSArray*array) {
_userNameText.text=array[0];
_passWordText.text=array[1];
}];
[self.navigationControllerpushViewController:resignVCanimated:YES];
}
if([button.titleLabel.textisEqualToString:@"登錄"]) {
NSLog(@"登錄");
}
}