ios 给网页传值_iOS学习——页面的传值方式
2.4 通知傳值
方法描述:在通知接收方需要注冊(cè)通知,并指定接收到通知后進(jìn)行的操作;而在通知發(fā)送方則在需要傳遞數(shù)據(jù)時(shí)發(fā)送通知就OK了。通知的操作都是通過(guò)NSNotificationCenter來(lái)完成的。
但是要注意的兩點(diǎn)是:
要想能夠接收到通知進(jìn)行處理,必須先注冊(cè)通知。
在注冊(cè)通知的頁(yè)面消毀時(shí)一定要移除已經(jīng)注冊(cè)的通知,否則會(huì)造成內(nèi)存泄漏
注冊(cè)的接收通知的名稱(chēng)必須和發(fā)送通知的名稱(chēng)保持一致才能接收到,否則無(wú)法接收到發(fā)出的通知
適用場(chǎng)景:
一般用于已經(jīng)通過(guò)push的方式進(jìn)入到子頁(yè)面,在從子頁(yè)面返回主頁(yè)面的時(shí)候(子頁(yè)面會(huì)釋放掉內(nèi)存),需要在主頁(yè)面中使用子頁(yè)面中的數(shù)據(jù),這是就可以利用通知反向傳值。
但是也可以用于通過(guò)push進(jìn)入子頁(yè)面時(shí)向子頁(yè)面?zhèn)鬟f數(shù)據(jù),這時(shí)就可以用通知進(jìn)行正向傳值。
傳遞方式:正向傳遞(很少這樣用)、反向傳遞(更常用)。
使用步驟:
反向傳遞:
在子頁(yè)面返回的時(shí)候發(fā)送通知,注冊(cè)的接收通知的名稱(chēng)必須和發(fā)送通知的名稱(chēng)保持一致才能接收到,否則無(wú)法接收到發(fā)出的通知
@interfaceKLSubViewController ()@end
@implementationKLSubViewController- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor whiteColor];
self.title= @"子界面";//布局代碼省略
.......
}- (void) btnClicked:(UIButton *)btn {//發(fā)送通知回傳數(shù)據(jù),回傳的數(shù)據(jù)格式自定義,這里定義為dictionary類(lèi)型
[[NSNotificationCenter defaultCenter] postNotificationName:@"TransDataNoti" object:nil userInfo:@{@"content":@"子頁(yè)面回傳的數(shù)據(jù)"}];
[self.navigationController popViewControllerAnimated:YES];
}
在主頁(yè)面注冊(cè)通知,并制定接收到通知后執(zhí)行的操作方法。需要注意的是,在注冊(cè)通知的頁(yè)面消毀時(shí)一定要移除已經(jīng)注冊(cè)的通知,否則會(huì)造成內(nèi)存泄漏。
@interfaceKLMainViewController ()
@property (strong, nonatomic) UITextField*textField;
@property (strong, nonatomic) UIButton*button;@end
@implementationKLMainViewController- (void)dealloc {//移除所有通知
[[NSNotificationCenter defaultCenter] removeObserver:self];//移除某個(gè)//[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TransDataNoti" object:nil];
}- (void)viewDidLoad {
[super viewDidLoad];
self.title= @"主界面";//布局代碼省略
......//注冊(cè)通知,用于接收通知,接收通知的名稱(chēng)必須和發(fā)送通知的名稱(chēng)保持一致才能接收到,否則無(wú)法接收到發(fā)出的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiReceived:) name:@"TransDataNoti" object:nil];
}//接收通知,解析內(nèi)容進(jìn)行處理
- (void)notiReceived:(NSNotification *)sender {
self.textField.text= sender.userInfo[@"content"];
}- (void) btnClicked:(UIButton *)btn {
KLSubViewController*subVC =[[KLSubViewController alloc] init];
[self.navigationController pushViewController:subVC animated:YES];
}@end
正向傳遞:和反向傳遞的不走基本就是反過(guò)來(lái)就OK了,但是有一點(diǎn)需要注意的是正向傳遞時(shí)從主界面push到子界面時(shí)發(fā)送通知,這時(shí)候要確保子界面已經(jīng)注冊(cè)了通知,否則會(huì)收不到通知的,所以正向傳遞時(shí),子界面通知的注冊(cè)應(yīng)該在子界面的初始化init方法中進(jìn)行。
在主頁(yè)面返回的時(shí)候發(fā)送通知,注冊(cè)的接收通知的名稱(chēng)必須和發(fā)送通知的名稱(chēng)保持一致才能接收到,否則無(wú)法接收到發(fā)出的通知。
@interfaceKLMainViewController ()
@property (strong, nonatomic) UITextField*textField;
@property (strong, nonatomic) UIButton*button;@end
@implementationKLMainViewController- (void)viewDidLoad {
[super viewDidLoad];
self.title= @"主界面";//布局代碼省略
......
}- (void) btnClicked:(UIButton *)btn {
KLSubViewController*subVC =[[KLSubViewController alloc] init];//發(fā)送通知回傳數(shù)據(jù),回傳的數(shù)據(jù)格式自定義,這里定義為dictionary類(lèi)型
[[NSNotificationCenter defaultCenter] postNotificationName:@"TransDataNoti" object:nil userInfo:@{@"content":@"主頁(yè)面?zhèn)鬟f的數(shù)據(jù)"}];
[self.navigationController pushViewController:subVC animated:YES];
}@end
在子頁(yè)面注冊(cè)通知,并制定接收到通知后執(zhí)行的操作方法。正向傳遞時(shí)注冊(cè)通知、基本布局不能放在viewDidLoad中,要放在初始化函數(shù)init中。
@interfaceKLSubViewController ()@end
@implementationKLSubViewController- (void)dealloc {//移除所有通知
[[NSNotificationCenter defaultCenter] removeObserver:self];//移除某個(gè)//[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TransDataNoti" object:nil];
}-(instancetype)init {
self=[super init];//初始化代碼省略
......//注冊(cè)通知,用于接收通知,接收通知的名稱(chēng)必須和發(fā)送通知的名稱(chēng)保持一致才能接收到,否則無(wú)法接收到發(fā)出的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiReceived:) name:@"TransDataNoti" object:nil];returnself;
}- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor whiteColor];
self.title= @"子界面";
}//接收通知,解析內(nèi)容進(jìn)行處理
- (void)notiReceived:(NSNotification *)sender {
self.textField.text= sender.userInfo[@"content"];
}- (void) btnClicked:(UIButton *)btn {
[self.navigationController popViewControllerAnimated:YES];
}@end
2.5 NSUserDefaults傳值
方法描述:NSUserDefaults傳值是將所要傳的值寫(xiě)在沙盒目錄里面,需要獲取值的時(shí)候直接訪(fǎng)問(wèn)沙盒,獲取這個(gè)值就可以了,這種傳值方法一般用在需要將數(shù)據(jù)本地存儲(chǔ)的時(shí)候,比如:用戶(hù)名之類(lèi),當(dāng)用戶(hù)下次登錄或者使用app的時(shí)候,可以直接從本地讀取。
適用場(chǎng)景:任何需要數(shù)據(jù)傳遞的場(chǎng)景都適用,但是傳遞數(shù)據(jù)的類(lèi)型僅限于基本數(shù)據(jù)類(lèi)型,不能用于自定義的對(duì)象類(lèi)型。
傳遞方式:正向傳值、反向傳值。
使用步驟:
需要傳值時(shí)將數(shù)據(jù)通過(guò)NSUserDefaults保存到沙盒目錄里面
- (void) btnClicked:(UIButton *)btn {/*setObject:后面寫(xiě)的就是所需要傳遞的值
forKey:要具有唯一性、一致性;
唯一性是指:當(dāng)代碼中用到多個(gè)NSUserDefaults方法時(shí),要保證不同的key不一樣,否則就是覆蓋值
一致性:這里傳遞一個(gè)值,當(dāng)需要用到的時(shí)候,要用valueForkey的方法,這個(gè)key和傳值時(shí)候?qū)懙膋ey要一樣,寫(xiě)錯(cuò)了就找不到值了。*/[[NSUserDefaults standardUserDefaults] setObject:@"NSUserDefaults傳值" forKey:@"NSUserDefaults"];
[[NSUserDefaults standardUserDefaults] synchronize];
[self.navigationController popViewControllerAnimated:YES];
}
需要使用值時(shí)通過(guò)NSUserDefaults從沙盒目錄里面取值進(jìn)行處理
_label.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"NSUserDefaults"];
2.6 單例傳值
方法描述:單例傳值的性質(zhì)和NSUserDefaults傳值的性質(zhì)類(lèi)似,只是單例傳值是將數(shù)據(jù)保存在單例對(duì)象中,需要的時(shí)候同樣從單例對(duì)象中去獲取數(shù)據(jù)使用就ok。
適用場(chǎng)景:任何需要數(shù)據(jù)傳遞的場(chǎng)景都適用,傳遞的數(shù)據(jù)可以是任何類(lèi)型的數(shù)據(jù)。
傳遞方式:正向傳值、反向傳值均OK。
使用步驟:
創(chuàng)建一個(gè)類(lèi),擁有一些屬性用于保存數(shù)據(jù),并實(shí)現(xiàn)單例方法
@interfaceKLDanliObj : NSObject
@property (nonatomic, copy) NSString*content; //保存數(shù)據(jù)數(shù)據(jù)的屬性
+ (instancetype) shardDanLiObj; //單例對(duì)象獲取方法
@end
#import "KLDanliObj.h"
static DanLi *danli =nil;@implementationKLDanliObj+(instancetype) shardDanLiObj {//實(shí)現(xiàn)方法,判斷是否為空,是就創(chuàng)建一個(gè)全局實(shí)例給它
if (danli ==nil) {
danli=[[KLDanliObj alloc] init];
}returndanli;
}@end
需要傳遞數(shù)據(jù)時(shí)使用單例類(lèi)將數(shù)據(jù)保存到單例的屬性中
[KLDanliObj shardDanLiObj].content = @"主界面?zhèn)鬟f的數(shù)據(jù)";
需要使用值時(shí)通過(guò)單例的屬性獲取數(shù)據(jù)進(jìn)行使用和處理
self.textField.text = [KLDanliObj shardDanLiObj].content;
2.7 KVC傳值
方法描述:KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iOS的開(kāi)發(fā)中,可以允許開(kāi)發(fā)者通過(guò)Key名直接訪(fǎng)問(wèn)對(duì)象的屬性,或者給對(duì)象的屬性賦值,而不需要調(diào)用明確的存取方法,這樣就可以在運(yùn)行時(shí)動(dòng)態(tài)地訪(fǎng)問(wèn)和修改對(duì)象的屬性。這其實(shí)和屬性傳值比較類(lèi)似。
適用場(chǎng)景:當(dāng)從主頁(yè)面push到子頁(yè)面時(shí),子頁(yè)面需要使用到主頁(yè)面的數(shù)據(jù),我們需要使用到正向傳值。
傳遞方式:正向傳值
使用步驟:
在需要傳值時(shí)使用KVC給子頁(yè)面的屬性進(jìn)行賦值就ok了
- (void) btnClicked:(UIButton *)btn {
KLSubViewController*subVC =[[KLSubViewController alloc] init];//給子頁(yè)面subVC的屬性content賦值 和subVC.content = @"主頁(yè)面?zhèn)鬟f的數(shù)據(jù)";效果一樣
[subVC setValue:@"主頁(yè)面?zhèn)鬟f的數(shù)據(jù)" forKey:@"content"];
[self.navigationController pushViewController:subVC animated:YES];
}
總結(jié)
以上是生活随笔為你收集整理的ios 给网页传值_iOS学习——页面的传值方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 好看的php提示弹窗,漂亮的jquery
- 下一篇: 信息学奥赛一本通 2043:【例5.11