iOS中常見的幾種頁面之間的通訊方式_(傳值方式)

1、屬性傳值
前向后傳值。
記住:
MainViewController與SecondViewController兩個視圖控制器,點擊MainViewController中的按鈕將跳轉(zhuǎn)到SecondViewController視圖,同時想要傳遞一個值過去。這時可以利用屬性傳值。
首先SecondViewController視圖中需要有一個屬性用來存儲傳遞過來的值:
@property(nonatomic,retain) NSString*firstValue ;//屬性傳值
然后MainViewController視圖需要引用SecondViewController視圖的頭文件,在視圖中的按鈕點擊事件中,通過SecondViewController的對象將需要傳遞的值存在firstValue中:

頁面跳轉(zhuǎn)之后,就能在SecondViewController視圖中,通過存值的屬性,取用剛才傳遞過來的值:
//顯示傳過來的值[_txtFiled setText:_firstValue];//firstValue保存?zhèn)鬟^來的值
2、方法傳值:
需求同一中的 屬性傳值一樣,但是要通過使用方法傳值,可以直接將方法與初始化方法合并,此時當(dāng)觸發(fā)MainViewController的按鈕點擊事件并跳轉(zhuǎn)到SecondViewController時,在按鈕點擊事件中可以直接通過SecondViewController的初始化,將值保存在firstValue中:
初始化方法如下: 首先SecondViewController視圖中需要有一個屬性用來存儲傳遞過來的值:
@property(nonatomic,retain) NSString *firstValue;//傳值用
iOS中常見的幾種頁面之間的通訊方式_(傳值方式)

這樣就可以直接通過firstValue屬性獲得傳遞過來的值:
//顯示傳過來的值[_txtFiledsetText:_firstValue];//firstValue保存?zhèn)鬟^來的值3:通知傳值
通知中心NSNotificationCenter提供了一種更加解耦的方式。最典型的應(yīng)用就是任何對象對可以發(fā)送通知到中心,同時任何對象可以監(jiān)聽中心的通知。發(fā)送通知的代碼如下:
[[NSNotificationCenterdefaultCenter] postNotificationName:@”myNotificationName” object:broadcasterObject];注冊接收通知的代碼如下:
[[NSNotificationCenterdefaultCenter] addObserver:listenerObject selector:@selector(receivingMethodOnListener:) name:@”myNotificationName” object:nil];注冊通知的時候可以指定一個具體的廣播者對象,但這不是必須的。你可能注意到了defaultCenter。實際上這是你在應(yīng)用中會使用到的唯一的中心。通知會向整個應(yīng)用開放,因此只有一個中心。同時還有一個NSDistributedNotificationCenter。這是用來應(yīng)用間通信的。在整個計算機(jī)上只有一個該類型的中心。優(yōu)點: 通知的發(fā)送者和接受者都不需要知道對方??梢灾付ń邮胀ㄖ木唧w方法。通知名可以是任何字符串。缺點: 較鍵值觀察需要多點代碼。在刪掉前必須移除監(jiān)聽者。 不能傳大量數(shù)值,只能讓誰去做什么事。
4:代理傳值(Delegate)
其中有兩個ViewController分別對應(yīng)兩個界面,一個協(xié)議PassValueDelegate用來實現(xiàn)傳值協(xié)議,UserEntity是傳遞數(shù)據(jù)的對象。以下是實現(xiàn)的效果:點擊Open進(jìn)入Second界面,輸入完畢點擊OK后回到First界面并顯示結(jié)果
協(xié)議中聲明的方法:
copy

import

@ class UserEntity;

@protocol PassValueDelegate

-( void)passValue:(UserEntity *)value;

@end
在第一個窗口實現(xiàn)協(xié)議:

import

import "PassValueDelegate.h"

//第一個窗口遵守PassValueDelegate
@interface ViewController : UIViewController

@property (retain, nonatomic) IBOutlet UILabel *nameLabel;
@property (retain, nonatomic) IBOutlet UILabel *ageLabel;
@property (retain, nonatomic) IBOutlet UILabel *gendarLabel;

  • (IBAction)openBtnClicked:(id)sender;

@end

.m文件中實現(xiàn)協(xié)議的方法:
[cpp]view plaincopy
//實現(xiàn)協(xié)議,在第一個窗口顯示在第二個窗口輸入的值方法
-( void)passValue:(UserEntity *)value
{
self.nameLabel.text = value.userName;
self.ageLabel.text = [NSString stringWithFormat:@"%d",value.age];
self.gendarLabel.text = value.gendar;
}

點擊Open按鈕所觸發(fā)的事件:
[cpp]view plaincopy
//點擊進(jìn)入第二個窗口的方法

  • (IBAction)openBtnClicked:(id)sender {
    SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];
    //設(shè)置第二個窗口中的delegate為第一個窗口的self
    secondView.delegate = self;

    [self.navigationController pushViewController:secondView animated:YES];
    }

第二個窗口中聲明一個NSObject對象,該對象遵守PassValueDelegate協(xié)議:
[cpp]view plaincopy

import

import "PassValueDelegate.h"

@interface SecondViewController : UIViewController

@property (retain, nonatomic) IBOutlet UITextField *nameTextField;
@property (retain, nonatomic) IBOutlet UITextField *ageTextFiled;
@property (retain, nonatomic) IBOutlet UITextField *gendarTextField;

//這里用assign而不用retain是為了防止引起循環(huán)引用。
@property(nonatomic,assign) NSObject *delegate;

  • (IBAction)okBtnClicked:(id)sender;
  • (IBAction)closeKeyboard:(id)sender;

@end

輸入完畢后,點擊OK按鈕所觸發(fā)的事件:
[cpp]view plaincopy

  • (IBAction)okBtnClicked:(id)sender {
    UserEntity *userEntity = [[UserEntity alloc] init];
    userEntity.userName = self.nameTextField.text;
    userEntity.gendar = self.gendarTextField.text;
    userEntity.age = [self.ageTextFiled.text intValue];

    //通過委托協(xié)議傳值
    [self.delegate passValue:userEntity];
    //退回到第一個窗口
    [self.navigationController popViewControllerAnimated:YES];

    [userEntity release];
    }

以上就實現(xiàn)了使用Delegate在兩個ViewController之間傳值,這種場景一般應(yīng)用在進(jìn)入子界面輸入信息,完后要把輸入的信息回傳給前一個界面的情況,比如修改用戶個人信息,點擊修改進(jìn)入修改界面,修改完后到顯示界面顯示修改后的結(jié)果。
5:Block傳值1.第一頁中 聲明一個 block,需要傳入一個顏色 , 讓當(dāng)前的view 變色
// 聲明一個 block, 需要傳入一個顏色 ,讓當(dāng)前的 view 變色
void (^changeColor)( UIColor *color) =^( UIColor *color){
self . view .backgroundColor = color;
};
2 . 第一頁中//block 傳值 ---------將 block 給第二個頁面
SecondViewController *secondVC = [[SecondViewController alloc ] init ];
//block 傳值 --------- 將 block給第二個頁面
secondVC. block = changeColor;
3.第二頁中定義 -- 當(dāng) block變量作為一個類的屬性 , 必須要使用copy 修飾
//block 傳值 --------- 將 block給第二個頁面
//block 傳值 --- 當(dāng) block變量作為一個類的屬性 , 必須要使用 copy修飾
@property ( nonatomic , copy) void (^block)( UIColor *color);
4.在第二頁中給block傳值
//block 傳值 --------- 將傳值給 block
NSArray *array = [NSArray arrayWithObjects :[ UIColor yellowColor ], [UIColor cyanColor], [ UIColor greenColor ], [UIColor brownColor], nil];
self . block([array objectAtIndex :rand () % 4]);

還有單例傳值丶數(shù)據(jù)共享等傳值方式,但是平時工作中很少用到,就不做解釋.最常用的幾種傳值方式也就以上五種,各有優(yōu)缺點吧,希望這篇文章能幫到大家把,感謝各位~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內(nèi)容