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