跨界面?zhèn)髦?/strong>
從一個(gè)界面將一個(gè)結(jié)果值傳到另一個(gè)界面,這個(gè)是我們?cè)陂_(kāi)發(fā)過(guò)程中非常常見(jiàn)的一個(gè)問(wèn)題。傳值本身并不是一個(gè)太復(fù)雜的問(wèn)題元媚,在此主要簡(jiǎn)述一下常用的傳值方法。
我們傳值常用的方法主要有四種:
1.屬性傳值
2.代理傳值
3.block傳值
4.通知傳值
5.KVO
6.對(duì)象傳值
屬性傳值:
屬性傳值應(yīng)該來(lái)說(shuō)是比較簡(jiǎn)單的一種傳值方式苗沧,但是這種傳值方式有其局限性惠毁,常用的一種場(chǎng)合是我們從界面A跳轉(zhuǎn)到界面B,如何我們想講界面A的值傳到界面B,屬性傳值是比較方便的一種方式崎页。如下圖所示,如果我們點(diǎn)擊A界面上的一個(gè)按鈕腰埂,跳轉(zhuǎn)到B界面飒焦,并且把A界面的一個(gè)值傳送到B界面。
先說(shuō)明一下大致的原理屿笼,首先要?jiǎng)?chuàng)建兩個(gè)控制器A和B牺荠,在A中導(dǎo)入B的頭文件,在A的按鈕點(diǎn)擊事件中驴一,添加A跳轉(zhuǎn)到B的代碼段⌒荽疲現(xiàn)在的問(wèn)題是如何在跳轉(zhuǎn)的過(guò)程中把A界面上的值傳到B界面呢?
我們可以給B添加一個(gè)屬性肝断,在點(diǎn)擊按鈕從A跳轉(zhuǎn)到B的時(shí)候杈曲,將A界面要傳送的值賦給B的屬性,這樣在B界面可以使用(self.屬性)直接獲取從A界面?zhèn)鬟^(guò)來(lái)的值胸懈。
代理傳值:
代理傳值對(duì)應(yīng)初學(xué)者來(lái)說(shuō)有一點(diǎn)難度担扑,但是多使用幾次就好了,像在系統(tǒng)中我們代理這種設(shè)計(jì)使用的非常廣泛趣钱,在此主要說(shuō)明使用代理傳值的方法涌献。我們?cè)陧?yè)面跳轉(zhuǎn)的過(guò)程中,將借助于導(dǎo)航首有,使用push從A界面跳轉(zhuǎn)到B界面燕垃,使用pop從B界面返回到A界面枢劝。
現(xiàn)在我們假設(shè)一種場(chǎng)景,我們需要從界面A傳值到界面B卜壕,同時(shí)也要從界面B傳值到界面A,如何使用代理來(lái)實(shí)現(xiàn)呢您旁?
首先使用代理傳值,我們需要知道怎么自定義代理印叁,首先先普及一下代理的相關(guān)知識(shí)被冒。
假如我們需要在A界面?zhèn)髦档紹界面,我們需要在A界面中定義一些協(xié)議方法轮蜕,只需要聲明方法即可昨悼,不需要實(shí)現(xiàn),如果其他類(lèi)想要訪問(wèn)這些協(xié)議方法跃洛,只需要遵守這些協(xié)議即可率触。在A中定義的協(xié)議方法,相當(dāng)于一個(gè)接口汇竭,你想使用A的接口葱蝗,就要遵守A的協(xié)議方法,例如在B中细燎,想要訪問(wèn)A的協(xié)議方法两曼,B就要遵守A的協(xié)議。傳值的話玻驻,B從A的協(xié)議方法中就能獲取到A界面中的值悼凑。
假如你向從界面B,pop到界面A璧瞬,并把界面B的值傳到界面A户辫,這種使用屬性傳值不太方便,使用代理可以解決嗤锉,從B界面往A傳值渔欢,協(xié)議方法應(yīng)該在B中寫(xiě)明,在A中遵守協(xié)議瘟忱。
block傳值
使用block傳值奥额,我們需要自定義代理,這種寫(xiě)法相對(duì)來(lái)說(shuō)是比較麻煩的酷誓,使用block傳值的話披坏,會(huì)使得代碼量大大縮減,現(xiàn)在我們假設(shè)我們要把界面A上的值傳到界面B盐数,使用block來(lái)實(shí)現(xiàn)棒拂。
通知傳值
通知傳值有點(diǎn)類(lèi)似于廣播,有發(fā)送者,有監(jiān)聽(tīng)者帚屉,比如A想接受B的值谜诫,B要發(fā)送一個(gè)通知,A只要監(jiān)聽(tīng)這個(gè)通知攻旦,就能接收到值喻旷,通知傳值就不細(xì)述。
例如發(fā)送一個(gè)通知:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:通知名字 object:self userInfo:傳遞參數(shù)];
接收一個(gè)通知:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(receiveNofitication:) name:通知名字 object:nil];
-(void)receiveNofitication:(NSNotification *)notification
{//接收到通知牢屋,執(zhí)行相關(guān)代碼}
跨應(yīng)用傳值
跨頁(yè)面跳轉(zhuǎn)且预,顧名思義就是在一個(gè)應(yīng)用內(nèi)不同界面之間的跳轉(zhuǎn),如果我們想要從一個(gè)應(yīng)用程序跳轉(zhuǎn)到另一個(gè)應(yīng)用程序怎么辦,加入你的手機(jī)上同時(shí)安裝了淘寶和支付寶兩個(gè)應(yīng)用程序烙无,你點(diǎn)擊支付的時(shí)候锋谐,手機(jī)會(huì)自動(dòng)打開(kāi)手機(jī)上安裝的應(yīng)用支付寶,這個(gè)功能如何實(shí)現(xiàn)截酷。
想要跨應(yīng)用跳轉(zhuǎn)涮拗,我們首先要確保手機(jī)上安裝了這兩個(gè)應(yīng)用,或者模擬器上安裝了這兩個(gè)應(yīng)用迂苛,然后點(diǎn)擊控件觸發(fā)事件實(shí)現(xiàn)不同應(yīng)用之間的跳轉(zhuǎn)三热。
我們先要分析一下如何實(shí)現(xiàn)這個(gè)功能:
如果我們從一個(gè)應(yīng)用跳轉(zhuǎn)到另一個(gè)應(yīng)用,我們需要有另一個(gè)應(yīng)用的標(biāo)示三幻,我們應(yīng)該稱(chēng)之為URL就漾,點(diǎn)擊響應(yīng)事件,跳轉(zhuǎn)到另一個(gè)應(yīng)用即可念搬。
如何給應(yīng)用設(shè)置URL:TAGGET->Info->URL Types->URL Schemes
在里面輸入標(biāo)示即可从藤。
現(xiàn)在假設(shè)我在模擬器上安裝了兩個(gè)應(yīng)用,一個(gè)叫BuyApp,設(shè)置標(biāo)示為buy,一個(gè)叫PayApp,設(shè)置標(biāo)示為pay.
現(xiàn)在我需要點(diǎn)擊按鈕锁蠕,跳轉(zhuǎn)到支付界面。(并且在跳轉(zhuǎn)的時(shí)候傳遞兩個(gè)參數(shù))
現(xiàn)在我們已經(jīng)知道支付界面的URL是pay.
我們可以在按鈕點(diǎn)擊事件中寫(xiě)入下面的代碼即可:
應(yīng)用跳轉(zhuǎn)
現(xiàn)在我們已經(jīng)進(jìn)入到PayApp懊蒸,如何在這個(gè)應(yīng)用中接受傳過(guò)來(lái)的參數(shù)呢荣倾?
我們可以在AppDelegate這個(gè).m文件中添加下面的方法:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
當(dāng)前應(yīng)用程序被別的應(yīng)用程序喚醒時(shí),執(zhí)行此方法骑丸。
參數(shù)分別是:
URL:程序跳轉(zhuǎn)的連接地址
sourceApplication:從哪個(gè)應(yīng)用程序跳轉(zhuǎn)過(guò)來(lái)舌仍。
我們可以從程序跳轉(zhuǎn)的連接地址中提取出傳遞過(guò)來(lái)的參數(shù)。這樣在第二個(gè)應(yīng)用中能夠獲取到第一個(gè)應(yīng)用傳遞過(guò)來(lái)的參數(shù)通危。
如果我們?cè)赑ayApp界面執(zhí)行完畢后铸豁,返回到原程序,執(zhí)行方法與上面的步驟相同菊碟。