1俘枫、屬性傳值
(1): 屬性傳值第一步需要用到什么類型就定義什么樣的屬性
(2): 從上一個頁面到一個頁面的選中方法里面將要傳的值傳到來(上一個頁面)備注:這種方法只適用于上一個頁面推到下一個頁面冈欢。
如:MainViewController與SecondViewController兩個視圖控制器,點擊MainViewController中的按鈕將跳轉(zhuǎn)到SecondViewController視圖僻孝,同時想要傳遞一個值過去噪猾。這時可以利用屬性傳值。
首先SecondViewController視圖中需要有一個屬性用來 存儲傳遞過來的值:
@property(nonatomic,retain) NSString *firstValue ;//屬性傳值
然后MainViewController視圖需要引用SecondViewController視圖的頭文件,在視圖中的按鈕點擊事件中歉眷,通過SecondViewController的對象將需要傳遞的值存在firstValue中:
-(void)buttonAction:(UIButton *)button
{
SecondViewController *second =
[[SecondViewController alloc]init];//用下一個視圖的屬性接受想要傳過去的值,屬性傳值
second.firstValue = _txtFiled.text;
[self.navigationControllerpushViewController:second animated:YES];
}
頁面跳轉(zhuǎn)之后,就能在SecondViewController視圖中颤枪,通過存值的屬性汗捡,取用剛才傳遞過來的值:
//顯示傳過來的值[_txtFiledsetText:_firstValue];//firstValue保存?zhèn)鬟^來的值
2、通知傳值
通知中心
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)用間通信的强品。在整個計算機上只有一個該類型的中心膘侮。
優(yōu)點: 通知的發(fā)送者和接受者都不需要知道對方〉拈唬可以指定接收通知的具體方法琼了。通知名可以是任何字符串。
缺點: 較鍵值觀察需要多點代碼夫晌。在刪掉前必須移除監(jiān)聽者雕薪。不能傳大量數(shù)值,只能讓誰去做什么事晓淀。
3所袁、代理協(xié)議傳值
(1)、協(xié)議(protocol)凶掰,就是使用了這個協(xié)議后燥爷,必須按照協(xié)議規(guī)定的內(nèi)容來處理事情,協(xié)議中要求的方法必須實現(xiàn)(@optional的方法除外)懦窘。
protocol是一種語法前翎,它提供了一個很方便的、實現(xiàn)delegate模式的機會畅涂。
定義protocol如下:
1. @protocol ClassBDelegate<NSObject>
2. - (void)methodOne;
3. @optional
4. - (void)methodTwo:(NSString *)value;
5. @end
定義了一個ClassB的協(xié)議港华,這個協(xié)議中包含兩個方法,其中methodTwo為可選的毅戈。
在ClassA的頭文件(ClassA.h)中實現(xiàn)這個協(xié)議苹丸,如下代碼:
1. @interface ClassA<ClassBDelegate>
2. @end
在ClassA的實現(xiàn)文件(ClassA.m)中實現(xiàn)ClassBDelegate的兩個方法,其中methodTwo可以不實現(xiàn)苇经,如下:
1. - (void)methodOne{
2. // 具體實現(xiàn)內(nèi)容
3. }
4.
5. - (void)methodTwo:(NSString *)value{
6. // 具體實現(xiàn)內(nèi)容
7. }
(2)赘理、代理(delegate),顧名思義就是委托別人辦事扇单,當(dāng)一件事情發(fā)生后商模,自己不處理,讓別人來處理蜘澜。
delegate和protocol沒有關(guān)系施流。delegate本身是一種設(shè)計模式。是把一個類自己需要做的一部分事情鄙信,讓另一個類(也可以就是自己本身)來完成瞪醋。
在ClassB的頭文件(ClassB.h)中定義一個代理如下:
1. @interface ClassB
2. @property (nonatomic, unsafe_unretained) id<ClassBDelegate> delegate;
3. @end
這樣,當(dāng)我們在ClassB的實現(xiàn)文件(ClassB.m)中遇到想讓別的類(如 ClassA)處理的問題時装诡,就可以這樣
1. [self.delegate methodOne];
2. [self.delegate methodTwo:@"需要傳遞的值"];