-
NSUserDefaults 傳值方法是系統(tǒng)幫我們封裝好的。也是將數(shù)據(jù)寫入到文件中,不需要自己去創(chuàng)建文件。默認(rèn)在沙盒路徑中存儲我們的數(shù)據(jù)
查看全部 -
NSUserDefaults傳值:
每一個工程在創(chuàng)建之后都有一個默認(rèn)的沙盒路徑。
通過一個頁面將數(shù)據(jù)通過NSUserDefaults的方法寫入到沙盒文件中,另一個文件通過沙盒文件讀取數(shù)據(jù)
和單例傳值比較接近,比較像,只不過單例是在內(nèi)存中傳值
查看全部 -
單例傳值:得有個單例對象。所以就要創(chuàng)建一個單例類。單例對象的創(chuàng)建其實就是保證對象在程序運(yùn)行過程中只有一個。就是說 每次通過類方法調(diào)用單例對象的時候都是同一個對象就可以了。
????都是同一個對象:那么就必須通過靜態(tài)變量的方式來進(jìn)行創(chuàng)建。靜態(tài)變量一旦被賦值之后,下次再讀取的是上一次的值
首先需要有一個類方法。
實現(xiàn)類方法來創(chuàng)建單例對象。
查看全部 -
頁面?zhèn)髦担?/p>
1:屬性傳值:主要運(yùn)用于正向傳值。不可以進(jìn)行反向傳值。也不能進(jìn)行跨頁面的傳值。
2:單例傳值:可以實現(xiàn)正向、反向、跨頁面?zhèn)髦?。?shù)據(jù)是寫入內(nèi)存中,然后再從內(nèi)存中讀取數(shù)據(jù)
????????????????? ?不好的點(diǎn):必須要創(chuàng)建一個單例對象才可以 。創(chuàng)建單例對象需要創(chuàng)建單例類
3:NSUserDefaults傳值:與單例傳值相像。它是將數(shù)據(jù)寫入沙盒文件中,再從沙盒文件中讀取數(shù)據(jù)
4:代理傳值:最經(jīng)典最常用的傳值方式。主要用于反向傳值,而且是一對一的,必須要兩個頁面之間建立代理關(guān)系。
5:block傳值:代理傳值能做的,block傳值都能做。也是一對一,頁面也要建立關(guān)系之后才能傳值
6:通知傳值:可以進(jìn)行跨頁面之間的傳值。多對多的傳值方式。發(fā)送方發(fā)送一個值,任何一個接收方都可以接收。所以接收方接收的通知,可以來自任何發(fā)送方
查看全部 -
屬性傳值 單例傳值 NSUserDefault傳值 Delegate傳值(常用) Block傳值(常用)查看全部
-
幾種常見的頁面?zhèn)髦捣绞剑?/p>
屬性傳值:主要用于正向傳值,比較簡單,過于單一,不能進(jìn)行反向傳值,也不能進(jìn)行跨頁面的傳值
單例傳值:比較強(qiáng)大,可以實現(xiàn)跨頁面,正向反向都可,但是要自己創(chuàng)建一個單例類,將數(shù)據(jù)寫至內(nèi)存
NSUserDefaults傳值:與單例傳值較像,但是是將數(shù)據(jù)寫至沙盒文件中,再進(jìn)行讀取數(shù)據(jù)
代理傳值:主要用于反向傳值,而且必須為一對一關(guān)系傳值
block傳值:可以做代理傳值能做的事,且代碼較為簡介,但是也是一對一的關(guān)系傳值
通知傳值:可多對多,可跨頁面?zhèn)髦?,接收方接受的通知可來自于任何一個發(fā)送方
查看全部 -
通知傳值111
查看全部 -
block傳值
查看全部 -
代理頁面?zhèn)髦?/p>
查看全部 -
NSUserDefaults傳值
查看全部 -
通知傳值
我們需要一個發(fā)送方和一個接收方
接收方先去監(jiān)聽,模擬從頁面2 通過通知的方式傳值到頁面1,頁面1自然就是接收方,那么接收方首先是需要來監(jiān)聽的,我們先看一下,我們需要監(jiān)聽來等待這個消息,所以我們先在頁面1 來監(jiān)聽通知,在哪個位置好呢,跳轉(zhuǎn)至頁面2之前我們先來做一個監(jiān)聽,還沒有到頁面2 呢我先來監(jiān)聽頁面2 的消息,你什么時候發(fā) ,我這邊自然就可以收到了,所以呢,在跳轉(zhuǎn)至頁面2之前? 添加監(jiān)聽。那么這個監(jiān)聽呢,我們注意一下是通過通知中心的方式也就是說給通知中心就是我們的廣播站來添加一個觀察者也就是監(jiān)聽者,那我們的通知中心是怎么創(chuàng)建的。
[NSNotificationCenter defaultCenter]addObserver:<#(nonnull id)#> selector:<#(nonnull SEL)#> name:<#(nullable NSNotificationName)#> object:<#(nullable id)#>
這就是我們的通知中心? 給他添加一個監(jiān)聽者addObserver就是我們的self我們的接收方,selector是我們接收到通知之后的一個處理
notHandle:帶一個參數(shù),參數(shù)就是我們的通知。name是什么呢? name就是通知的名字,你要監(jiān)聽哪一個通知,所以呢notify就是通知的名字,
object這個參數(shù)填nil就行了,也就是你監(jiān)聽來自哪里的通知,填nil的話表示廣播群發(fā)的,任何一個發(fā)送方只要發(fā)送了一個叫notify的通知,我們都可以收到。所以呢我們就添加好了這個觀察者了,然后呢我們來實現(xiàn)
notHandle的方法
就是我們收到通知之后的一個處理,那么他需要一個參數(shù)就是我們的通知
回到頁面2去發(fā)通知,在點(diǎn)擊回到頁面1的時候進(jìn)行傳值,發(fā)送通知要通過廣播站來發(fā)送就是我們的通知中心?
查看全部 -
協(xié)議和block頁面?zhèn)髦祽?yīng)用于兩個有直接跳轉(zhuǎn)關(guān)系的頁面之間的傳值
通知傳值相對來說更靈活? 特別是在實現(xiàn)跨頁面之間跳轉(zhuǎn)的時候
和我們生活里的通知是一樣的,需要有一個發(fā)送方和一個接受方,例如廣播站,廣播員就是我們的發(fā)送方他是廣播數(shù)據(jù)的,而接收方就是我們的收音機(jī),是用來接收數(shù)據(jù)的,發(fā)送方和接收方之間如果要進(jìn)行通訊的話,那么需要一個中間介質(zhì),就是我們的通知中心,也就是我們生活里面的廣播站,如果沒有廣播站的話 ,廣播員和收音機(jī)之間是無法進(jìn)行通訊的,所以代碼里面的通知中心就模擬了廣播站的概念,發(fā)送方是發(fā)送數(shù)據(jù) ,接收方是接收數(shù)據(jù)的,但是在代碼里面,我們需要注意的是我們要先在接收方定義一個觀察者來等待通知中心發(fā)出的消息,那么當(dāng)他等待之后,發(fā)送方將通知發(fā)送出去,先發(fā)送到通知中心,然后通知中心拿到數(shù)據(jù)再回調(diào)給我們的接收方。這就是通知傳值的一個過程。
為什么要先觀察后發(fā)送呢,其實很簡單 ,生活中也是一樣
如果廣播員先去廣播通知,你的收音機(jī)還沒有打開,當(dāng)你的收音機(jī)打開之后再去監(jiān)聽的話可能已經(jīng)廣播完了,你沒有聽到,所以如果你想收到廣播的通知,那么你必須首先打開收音機(jī)監(jiān)聽這段通知,當(dāng)通知來的時候就可以收到這份通知并且做后續(xù)的處理工作,那我們代碼也是一樣處理的,我們接收方要先觀察等待通知中心的消息,然后通知我們的發(fā)送方發(fā)送了通知,我們的通知中心自然就把消息轉(zhuǎn)播到接收方了。所以這就是通知傳值的一個過程
查看全部 -
block傳值主要應(yīng)用于反向頁面?zhèn)髦?,我們需要在第二個頁面定義一個block用來傳值
定義一個屬性? 為了防止block的循環(huán)引用,block一搬都定義為copy屬性
@property (copy)? ?void? ? ? ? ?(^block)? ? ? ? ? (NSString*);也傳遞一個字符串
? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回值類型? ?block的名字? ? block的參數(shù)??^block的標(biāo)志
看到小箭頭一定是個block?
//定義一個block進(jìn)行反向傳值
一個block定義好了,block寫法相對來說麻煩了一些,但是非常好用,建議大家經(jīng)常去使用block,用多了自然就寫熟了
頁面2 跳轉(zhuǎn)回頁面1 的時候進(jìn)行傳值
直接調(diào)用self.block()傳值就可以了 他的傳值方式 也和C語言一樣,可以理解為block就是一個C語言函數(shù),小括號就是C語言里的小括號,小括號里面?zhèn)鬟f的就是我們的實參
//block傳值--反向傳值
? ? self.block(self.textField.text);
回到頁面1 如何來接收這個block呢,block不像協(xié)議? 實現(xiàn)協(xié)議方法就可以了,block需要實現(xiàn)的話? 它是一個對象的屬性,我們要向?qū)崿F(xiàn)block就是實現(xiàn)這個對象的屬性,所以我們在創(chuàng)建頁面2 的時候,我們就要實現(xiàn)這個block.
一面?zhèn)髦? ?一面接收值?
查看全部 -
block傳值
蘋果最推薦也是目前最為流行的一種傳值方式,它和代理傳值做著一樣的工作,代理傳值能做的工作block都能做,他比代理傳值寫法更簡單更容易理解一些,這是近兩年蘋果主推的一種傳值的方式。
頁面1跳轉(zhuǎn)到頁面2? 頁面2回調(diào)block進(jìn)行傳值
頁面1只需要實現(xiàn)block接收數(shù)據(jù)就可以了
簡單在不需要設(shè)置代理也不需要定義一個協(xié)議
查看全部 -
代理傳值的整個過程。
代理傳值主要是反向傳,那么反向傳我們從頁面2將值傳遞到頁面1 ,頁面2 就是我們的委托方,委托方是持有協(xié)議并且調(diào)用協(xié)議方法,而且我們的協(xié)議也是定義在委托方的,首先來看一下協(xié)議怎么定義,
@protocol passValueDelegate <NSObject>
一個傳值的這么一個代理
定義一個方法,這個方法有一個參數(shù)也就是我們要傳遞的值,那看你傳什么值了,如果是字符串就定義一個字符串,如果是某一個類的對象那你就定義一個對象就行了,我們用字符串來演示一下.
//委托方-創(chuàng)建一個協(xié)議
@protocol passValueDelegate <NSObject>
//協(xié)議定義一個傳值的方法
-(void)passValue:(NSString*)str;
@end
協(xié)議創(chuàng)建好了
那么委托方需要做的事情就是持有協(xié)議、然后呢再去調(diào)用協(xié)議方法傳值就可以了
所以呢我們要持有協(xié)議的話我們需要一個weak id指針? ?一個id指針?biāo)浅钟袇f(xié)議的,持有協(xié)議怎么來表現(xiàn)呢尖括號里面寫上協(xié)議的名字就可以了,
這就是定義一個id指針,它呢持有了協(xié)議,指針的名字就叫delegate,指針的名字可以自己來取,代理呢為了防止循環(huán)引用一般使用weak來定義
持有協(xié)議之后接下來就是調(diào)用協(xié)議方法來進(jìn)行傳值
點(diǎn)擊頁面2button的時候我們來調(diào)用我們的方法
?//代理傳值--反向傳值
這里呢使用我們的id指針 self.delegate調(diào)用我們協(xié)議的方法?
passValue
傳值傳誰呢 就傳我們textfile里面輸入的值
[self.delegate passValue:self.textField.text];
這樣就實現(xiàn)了代理的反向傳值
那么頁面2 通過協(xié)議將這個值傳遞之后,發(fā)出去之后? 那頁面1 怎么來接收呢
那就是我們的代理方了,代理方需要做兩個事情就是遵守協(xié)議,實現(xiàn)協(xié)議方法。
遵守協(xié)議怎么來遵守呢
@interface ViewController ()<passValueDelegate>//遵守協(xié)議
并且實現(xiàn)協(xié)議方法
//代理傳值--實現(xiàn)協(xié)議方法--接收來自頁面2的值
-(void)passValue:(NSString *)str
接收來自頁面2的值 :self.textField.text
我們并沒有設(shè)置代理,兩方如果通訊需要先把代理關(guān)系設(shè)置好才可以,
代理關(guān)系在哪設(shè)置,就是在我要通話的時候,第一個頁面跳轉(zhuǎn)至第二個頁面的時候,需要先把代理關(guān)系設(shè)置好,設(shè)置好之后才可以進(jìn)行通訊,才可以從第二個頁面將值傳回到第一個頁面.將第二個頁面他的代理設(shè)置為第一個頁面(self)。
查看全部 -
代理傳值在iOS中是非常重要的傳值方式也是用的最多的傳值方式,相對來說要比前面三種麻煩一些。
代理傳值需要有兩個頁面,分別是委托方和代理方
委托方和代理方要進(jìn)行通訊的話,必須得先有一個協(xié)議,和生活里面也是一樣的,中介 和 小名之間需要有一份協(xié)議,協(xié)議就規(guī)定了這兩方之間如何進(jìn)行通訊 ,也就是它做了一個約束,大家都遵守這個約束,就可以進(jìn)行通訊了。
代理傳值在iOS中的表現(xiàn)就是?
委托方 呢持有協(xié)議并且調(diào)用協(xié)議方法
代理方呢遵守協(xié)議實現(xiàn)協(xié)議方法
我們?nèi)绻雮髦档?話,委托方持有協(xié)議調(diào)用協(xié)議方法進(jìn)行傳值
而代理方只要遵守了這個協(xié)議并且實現(xiàn)協(xié)議的方法 就可以接收委托方傳過來的值,所以呢這就是我們的代理傳值。他呢主要是圍繞協(xié)議進(jìn)行的,如果沒有了協(xié)議沒有了這個約束,那么兩方是不能進(jìn)行通訊的,所以這就是我們的代理傳值。主要是應(yīng)用于反向傳值的。也就是說我們從頁面1跳轉(zhuǎn)到頁面2 然后頁面2反向給頁面1進(jìn)行傳值,我們可以通過代理的方式來進(jìn)行傳遞。
查看全部 -
如果是反向傳值,在頁面2 回到頁面1的時候,
NSUserDefault傳值也可以實現(xiàn)跨頁面的傳值
查看全部 -
NSUserDefault傳值
這個傳值比較簡單? 就是系統(tǒng)幫我們封裝好的方法,也是將數(shù)據(jù)寫入到文件中,不需要我們自己去創(chuàng)建文件,默認(rèn)在沙盒路徑中創(chuàng)建一個文件來存儲我們的數(shù)據(jù)。
? ? [[NSUserDefaults standardUserDefaults] setObject:@"NSUserDefaults傳值" forKey:@"NSUserDefaults"];
以上實現(xiàn)了NSUserDefaults寫數(shù)據(jù)
寫數(shù)據(jù)之后我們需要同步一下才能真正寫入到我們的文件中。
寫入到文件之后,第一個頁面就完成了
第二個頁面需要讀取數(shù)據(jù),在我們的文件中讀取就行了
寫入的時候以字典的方式寫入,讀取的時候以字典的方式讀取,key就是剛才寫入的key,一定要保持一致。以及唯一性,唯一性就是如果有多個
@"NSUserDefaults"保證key不能重復(fù),一致性就是讀的和寫的必須是同一個key。
將數(shù)據(jù)從頁面1傳遞到了頁面2
查看全部 -
NSUserDefaults傳值
首先得有兩個頁面,頁面1 頁面2??
沙盒文件,每一個工程創(chuàng)建之后都有一個默認(rèn)的沙盒路徑
通過一個頁面將數(shù)據(jù)寫入到沙盒文件中(通過NSUserDefaults的方式寫入)
另一個頁面在沙盒文件中讀取數(shù)據(jù)就行了
和單例傳值比較接近? 比較像,只不過單例傳值我們是在內(nèi)存中創(chuàng)建了一個單例對象
現(xiàn)在是將我們的數(shù)據(jù)寫入到磁盤也就是沙盒文件中
傳值的方式是差不多的
查看全部 -
單例傳值
兩個頁面 一個單例對象
其中一個頁面將數(shù)據(jù)寫入到單例對象
另一個頁面從單例對象讀取數(shù)據(jù)
就實現(xiàn)了頁面之間的數(shù)據(jù)傳遞? 將一個頁面的數(shù)據(jù)傳入到另外一個頁面,通過單例的方式來傳遞。
單例傳值必須有一個單例對象。
創(chuàng)建一個單例對象,單例的創(chuàng)建
單例的創(chuàng)建
通過類方法創(chuàng)建單例對象
保證對象就是在程序運(yùn)行過程中只有一個就可以了,每次通過類方法來調(diào)取單例的時候都是同一個對象就可以了。
要想保證這個過程,通過靜態(tài)變量的方式來進(jìn)行創(chuàng)建,因為靜態(tài)變量一旦被賦了值之后? 下次再讀取的是上一次的值,和普通的局部變量不一樣。
先通過靜態(tài)變量的方式來創(chuàng)建一個變量
單例對象如何來傳值呢
屬性傳值,在第一個頁面向第二個頁面跳轉(zhuǎn)的時候,給第二個頁面的屬性賦了值,這就是屬性傳值
單例傳值和屬性傳值也差不多,如果是正向的就可以給這個對象來賦值了。
先拿到單例對象,要通過單例來傳值,比如也傳遞一個字符串,
從頁面2給頁面1傳值通過單例也可以實現(xiàn)
在頁面2點(diǎn)擊button回到頁面1的時候可以傳遞回一個值
查看全部
舉報