亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS頁面間傳值的方式(Delegate/NSNotification/Block/NSUserDefault/單例)

2019-11-14 20:14:30
字體:
來源:轉載
供稿:網友

 

iOS頁面間傳值的方式(NSUserDefault/Delegate/NSNotification/Block/單例)

實現了以下iOS頁面間傳值:1.委托delegate方式;2.通知notification方式;3.block方式;4.UserDefault或者文件方式;5.單例模式方式;6.通過設置屬性,實現頁面間傳值

在iOS開發中,我們經常會遇到頁面間跳轉傳值的問題,現歸納總結一下:

情況1:A頁面跳轉到B頁面

方法:

在B頁面的控制器中,編寫對應的屬性,在A頁面跳轉到B頁面的地方,給B的屬性賦值即可

//SecondViewController.h

@PRoperty(nonatomic) NSInteger flag;//當前系統標示(0:其他傳值方式;1:block傳值方式)

在A頁面的試圖控制器中

 

//RootViewController.m

- (IBAction)showSecondView:(id)sender { SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; second.delegate = self; second.flag = 0; [self presentViewController:second animated:YES completion:nil];}

 

情況2:A頁面跳轉到B頁面,B頁面再跳轉回A頁面

主流方案:

(1)通過委托delegate的方式實現

 

設置協議及方法
 
 
 
 
 
//SecondViewController.h

@protocol
secondViewDelegate-(void)showName:(NSString *)nameString;@end

 

設置代理(為防止循環引用,此處采用了weak)

 

//SecondViewController.h

@interface
SecondViewController : UIViewController@property (nonatomic, weak)id<secondViewDelegate> delegate;@property (nonatomic, copy) ablock block;@end
 
 調用
//SecondViewController.m
- (IBAction)delegateMethod:(id)sender { if ([self notEmpty]) { [self.delegate showName:self.nameTextField.text]; [self dismissViewControllerAnimated:YES completion:nil]; }else{ [self showAlert]; }}

顯示
 
//RootViewController.m
-(void)showName:(NSString *)nameString{ self.nameLabel.text = nameString;}

 

最重要也是最容易忽略的,就是一定要設置delegate的指向。
 
 

(2)通過通知notification的方式實現

在B頁面的控制器中,發送通知:
//SecondViewController.m- (IBAction)notificationMethod:(id)sender {    if ([self notEmpty]) {        [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeNameNotification" object:self userInfo:@{@"name":self.nameTextField.text}];        [self dismissViewControllerAnimated:YES completion:nil];    }else{        [self showAlert];    }}

 

在A頁面的控制器中,注冊通知:

//RootViewController.m- (void)viewDidLoad{    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNameNotification:) name:@"ChangeNameNotification" object:nil];}

當我們不使用時,要記得刪掉通知:

//RootViewController.m-(void)dealloc{    [[NSNotificationCenter defaultCenter] removeObserver:self];}

 

 調用,顯示

//RootViewController.m-(void)ChangeNameNotification:(NSNotification*)notification{    NSDictionary *nameDictionary = [notification userInfo];    self.nameLabel.text = [nameDictionary objectForKey:@"name"];}

 

(3)block方式實現

block介紹:http://blog.csdn.net/totogo2010/article/details/7839061

鏈接一篇描述block回調挺有意思的文章: http://blog.csdn.net/mobanchengshuang/article/details/11751671

分析:

在B試圖控制器中,定義一個block,參數為字符串

//SecondViewController.htypedef void (^ablock)(NSString *str);
//SecondViewController.h@property (nonatomic, copy) ablock block;

在B試圖控制器中,當輸入名字,點擊對應的確定按鈕后

- (IBAction)blockMethod:(id)sender {    if ([self notEmpty]) {        if (self.block) {            self.block(self.nameTextField.text);            [self dismissViewControllerAnimated:YES completion:nil];        }    }else{        [self showAlert];    }}

在A試圖顯示,回調block

- (IBAction)showSecondWithBlock:(id)sender {    SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];    [self presentViewController:second animated:YES completion:nil];    second.block = ^(NSString *str){        self.nameLabel.text = str;    };}

 

(4)KVO方式實現 

KVO實現原理介紹:http://blog.csdn.net/kesalin/article/details/8194240

在A視圖中,編寫以下代碼 

//A視圖//一個指向B視圖的成員變量@property (nonatomic, strong) SecondViewController *second;//在A視圖跳轉到B視圖的地方添加如下代碼    self.second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];    [self.second addObserver:self forKeyPath:@"userName" options:NSKeyValueObservingOptionNew context:nil];    [self presentViewController:self.second animated:YES completion:nil];-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{//此處監聽key對應值的變化情況    if ([keyPath isEqualToString:@"userName"]) {        self.myLabel.text = self.second.userName;    }}//清理觀察- (void)dealloc{    [self.second removeObserver:self forKeyPath:@"userName"];}

 

 在B視圖編寫以下代碼

//在B視圖//.h文件@property (nonatomic, strong) NSString *userName;//待監聽的成員變量//可以在兩處修改userName的值。一個是設置textfield的UITextFieldDelegate。實現一下方法-(void)textFieldDidEndEditing:(UITextField *)textField{self.userName = self.myField.text;}//或者在B視圖,點擊確定按鈕,跳轉回A視圖的時候,修改userName的值也可以- (IBAction)buttonPressed:(id)sender {    self.userName = self.myField.text;    [self dismissViewControllerAnimated:YES completion:nil];}

 

 

 

在查閱資料的過程中,我還看到了以下幾種方案:

(1)使用Sharedapplication,定義一個變量來傳遞(感覺和單例的方式一樣)

 

(2)使用文件,或者NSUserdefault來傳遞

 

//通過文件或者UserDefault方式存值(感覺不太適合此類傳值,如果要用文件或者UserDefault方式存值的話,可以考慮此方式)- (IBAction)userDefaultMethod:(id)sender {    if ([self notEmpty]) {        [[NSUserDefaults standardUserDefaults] setObject:self.nameTextField.text forKey:@"myNameText"];        [self dismissViewControllerAnimated:YES completion:nil];    }else{        [self showAlert];    }}

在A試圖控制器顯示

-(void)viewDidAppear:(BOOL)animated{    [super viewDidAppear:animated];    //如果想測試通過UserDefault方式傳值或者通過單例方式傳值,取消以下注釋即可/*    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"] length] != 0) {        self.nameLabel.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"];        [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"myNameText"];    }    DataSource *dataSource = [DataSource sharedDataSource];    if ([dataSource.myName length] != 0) {        self.nameLabel.text = dataSource.myName;        dataSource.myName = @"";    }*/}

 

(3)通過一個單例的class來傳遞

B試圖控制器

//通過單例方式傳值(感覺不太適合此類傳值,如果要用單例方式傳值的話,可以考慮此方式)- (IBAction)singletonMethod:(id)sender {    if ([self notEmpty]) {        DataSource *dataSource = [DataSource sharedDataSource];        dataSource.myName = self.nameTextField.text;        [self dismissViewControllerAnimated:YES completion:nil];    }else{        [self showAlert];    }}

A試圖控制器顯示

-(void)viewDidAppear:(BOOL)animated{    [super viewDidAppear:animated];    //如果想測試通過UserDefault方式傳值或者通過單例方式傳值,取消以下注釋即可/*    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"] length] != 0) {        self.nameLabel.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"];        [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"myNameText"];    }    DataSource *dataSource = [DataSource sharedDataSource];    if ([dataSource.myName length] != 0) {        self.nameLabel.text = dataSource.myName;        dataSource.myName = @"";    }*/}@end

這里面用到了單例模式,編寫了DataSource這個類,存放數據

////  DataSource.h//  TestCallBack////  Created by csdc-iMac on 14-7-17.//  Copyright (c) 2014年 JuneWang. All rights reserved.//#import <Foundation/Foundation.h>@interface DataSource : NSObject@property (nonatomic, strong) NSString *myName;+(DataSource*)sharedDataSource;@end 

 

////  DataSource.m//  TestCallBack////  Created by csdc-iMac on 14-7-17.//  Copyright (c) 2014年 JuneWang. All rights reserved.//#import "DataSource.h"@implementation DataSource+(DataSource *)sharedDataSource{    static DataSource *dataSource = nil;    static dispatch_once_t once;    dispatch_once(&once, ^{        dataSource = [DataSource new];    });    return dataSource;}@end

 

程序運行截圖

A視圖:

B視圖

當輸入姓名,并點擊對應的確認按鈕后,會回到A視圖,并顯示在B視圖中輸入的姓名

 

PS:用全局變量的方式也可以實現頁面傳值的效果。

 

祝:玩得開心,有什么別的辦法或者不正確的地方,歡迎指正。

如果寫得不詳細,可以通過源碼分析。

 

 參考:http://blog.csdn.net/cocoarannie/article/details/11857141

http://www.49028c.com/heri/archive/2013/03/18/2965815.html

 

源碼地址:https://github.com/wangtao169447/PassValue

轉載請注明出處:http://www.49028c.com/JuneWang/p/3850859.html 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美小视频在线观看| 欧美三级免费观看| 国产精品扒开腿爽爽爽视频| 亚洲精品视频在线播放| 国外成人性视频| 精品久久久久久亚洲精品| 色婷婷亚洲mv天堂mv在影片| 亚洲欧美成人网| 久久久999精品| 久久好看免费视频| 日韩一区二区在线视频| 国产91精品高潮白浆喷水| 亚洲欧美中文字幕在线一区| 精品国内产的精品视频在线观看| xvideos亚洲| 亚洲成人久久一区| 欧美成人午夜激情| 激情av一区二区| 国外成人在线直播| 88国产精品欧美一区二区三区| 亚洲午夜精品视频| 欧美大胆在线视频| 亚洲精品免费av| 欧美性猛xxx| 亚洲福利视频在线| 色综合导航网站| 欧美风情在线观看| 日韩一区二区三区在线播放| 国产69精品99久久久久久宅男| 亚洲精品国产拍免费91在线| 日韩美女视频免费在线观看| 少妇激情综合网| 久久久久久久久久久免费精品| 国产精品96久久久久久| 亚洲摸下面视频| 97国产精品人人爽人人做| 欧美精品videosex牲欧美| 日韩电影免费在线观看| 隔壁老王国产在线精品| 国产日本欧美一区二区三区在线| 伊人久久精品视频| 91九色视频在线| 久久这里只有精品99| 国产日韩专区在线| 久久天天躁狠狠躁夜夜躁| 久久久久国色av免费观看性色| 日韩视频在线免费观看| 成人免费看吃奶视频网站| 日韩电影中文 亚洲精品乱码| 欧美日韩精品在线播放| 在线观看日韩av| 欧美性猛交视频| 日韩中文字幕av| 国产精品视频久久| 国产精品一区二区久久久久| 最近2019中文字幕一页二页| 久久视频免费观看| 久久网福利资源网站| 91精品国产91久久久久久不卡| 亚洲无限乱码一二三四麻| 亚洲欧美激情另类校园| 国产aⅴ夜夜欢一区二区三区| 亚洲理论片在线观看| 国产伦精品一区二区三区精品视频| 精品国产区一区二区三区在线观看| 欧美亚洲成人xxx| 这里精品视频免费| 亚洲成成品网站| 日韩成人小视频| 国产一区玩具在线观看| 久久久影视精品| 日韩动漫免费观看电视剧高清| 精品国产91乱高清在线观看| 国产区精品在线观看| 草民午夜欧美限制a级福利片| 国产色视频一区| 精品一区二区三区四区| 成人久久一区二区| 亚洲精品国产品国语在线| 成人a免费视频| 欧美精品在线免费| 亚洲性视频网站| 国产精品夜色7777狼人| 国产91av在线| 伊人伊人伊人久久| 国产噜噜噜噜久久久久久久久| 欧美小视频在线观看| 欧美美最猛性xxxxxx| 91在线精品播放| 久久久久久久久久av| 午夜精品久久久久久久99黑人| 日本a级片电影一区二区| 在线中文字幕日韩| 欧美一级电影免费在线观看| 红桃视频成人在线观看| 欧美日韩国产色| 国产日韩精品电影| 欧美激情精品久久久久| 欧美高清一级大片| 欧美一级片在线播放| 久久99精品久久久久久青青91| 欧美在线视频导航| 久久99国产精品久久久久久久久| 中文字幕国产精品久久| 精品国产区一区二区三区在线观看| 国产999在线观看| 欧美另类极品videosbest最新版本| 中文字幕精品久久| 欧美性videos高清精品| 操人视频在线观看欧美| 精品国产1区2区| 8x拔播拔播x8国产精品| 在线观看亚洲区| 欧美老妇交乱视频| 国产精品高清免费在线观看| 91久久久久久久久久久久久| 国产精品久久久久不卡| 国产91精品最新在线播放| 国产精品免费视频xxxx| 国产精品免费一区| 国产91免费观看| 欧美亚洲成人网| 亚洲国产精品久久精品怡红院| 96sao精品视频在线观看| 国产中文日韩欧美| 日韩一区二区三区xxxx| 综合网中文字幕| 亚洲欧美资源在线| 国产精品美女www| 国产精品高清在线观看| 久久久免费精品| 欧美精品在线观看| 91精品久久久久久久久久| 欧美高清在线播放| 亚洲一区二区免费| 国产a级全部精品| 国产成人精品视频在线| 成人免费激情视频| 久久韩国免费视频| 国产精品专区h在线观看| 在线播放日韩专区| 国产精品99久久99久久久二8| 国产日韩欧美黄色| 美乳少妇欧美精品| 日本一区二区在线播放| 国产一区二区在线免费视频| 美女视频黄免费的亚洲男人天堂| 欧美成人亚洲成人日韩成人| 欧美激情一区二区三区高清视频| 97精品一区二区三区| 91av在线视频观看| 亚洲一区二区免费| 日韩av男人的天堂| 亚洲黄页网在线观看| 日韩欧美一区二区三区久久| 久久久久成人网| 亚洲国产精品一区二区久| 国产精品第一页在线| 欧美午夜精品久久久久久久| 91理论片午午论夜理片久久| xx视频.9999.com| 国外成人在线直播| 国产综合香蕉五月婷在线| 欧美激情免费看|