3:通知傳值
通知中心
NSNotificationCenter提供了一種更加解耦的方式。最典型的應(yīng)用就是任何對(duì)象對(duì)可以發(fā)送通知到中心,同時(shí)任何對(duì)象可以監(jiān)聽中心的通知度帮。
發(fā)送通知的代碼如下:
[[NSNotificationCenter defaultCenter] postNotificationName:@”myNotificationName” object:broadcasterObject];
注冊(cè)接收通知的代碼如下:
[[NSNotificationCenter defaultCenter] addObserver:listenerObject selector:@selector(receivingMethodOnListener:) name:@”myNotificationName” object:nil];
注冊(cè)通知的時(shí)候可以指定一個(gè)具體的廣播者對(duì)象,但這不是必須的稿存。你可能注意到了defaultCenter 笨篷。實(shí)際上這是你在應(yīng)用中會(huì)使用到的唯一的中心。通知會(huì)向整個(gè)應(yīng)用開放瓣履,因此只有一個(gè)中心率翅。
同時(shí)還有一個(gè)NSDistributedNotificationCenter。這是用來應(yīng)用間通信的袖迎。在整個(gè)計(jì)算機(jī)上只有一個(gè)該類型的中心冕臭。
優(yōu)點(diǎn): 通知的發(fā)送者和接受者都不需要知道對(duì)方⊙嘧叮可以指定接收通知的具體方法辜贵。通知名可以是任何字符串。
缺點(diǎn): 較鍵值觀察需要多點(diǎn)代碼归形。在刪掉前必須移除監(jiān)聽者托慨。 不能傳大量數(shù)值,只能讓誰去做什么事暇榴。
4:代理傳值(Delegate)
其中有兩個(gè)ViewController分別對(duì)應(yīng)兩個(gè)界面厚棵,一個(gè)協(xié)議PassValueDelegate用來實(shí)現(xiàn)傳值協(xié)議,UserEntity是傳遞數(shù)據(jù)的對(duì)象蔼紧。
以下是實(shí)現(xiàn)的效果:點(diǎn)擊Open進(jìn)入Second界面窟感,輸入完畢點(diǎn)擊OK后回到First界面并顯示結(jié)果
協(xié)議中聲明的方法:
copy
#import
@ class? UserEntity;
@protocol PassValueDelegate
-( void )passValue:(UserEntity *)value;
@end
在第一個(gè)窗口實(shí)現(xiàn)協(xié)議:
#import
#import "PassValueDelegate.h"
//第一個(gè)窗口遵守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文件中實(shí)現(xiàn)協(xié)議的方法:
[cpp]view plaincopy
//實(shí)現(xiàn)協(xié)議,在第一個(gè)窗口顯示在第二個(gè)窗口輸入的值方法
-( void )passValue:(UserEntity *)value
{
self.nameLabel.text = value.userName;
self.ageLabel.text = [NSString stringWithFormat:@ "%d" ,value.age];
self.gendarLabel.text = value.gendar;
}
點(diǎn)擊Open按鈕所觸發(fā)的事件:
[cpp]view plaincopy
//點(diǎn)擊進(jìn)入第二個(gè)窗口的方法
- (IBAction)openBtnClicked:(id)sender {
SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@ "SecondViewController"? bundle:[NSBundle mainBundle]];
//設(shè)置第二個(gè)窗口中的delegate為第一個(gè)窗口的self
secondView.delegate = self;
[self.navigationController pushViewController:secondView animated:YES];
}
第二個(gè)窗口中聲明一個(gè)NSObject對(duì)象歉井,該對(duì)象遵守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
輸入完畢后,點(diǎn)擊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];
//退回到第一個(gè)窗口
[self.navigationController popViewControllerAnimated:YES];
[userEntity release];
}
以上就實(shí)現(xiàn)了使用Delegate在兩個(gè)ViewController之間傳值,這種場(chǎng)景一般應(yīng)用在進(jìn)入子界面輸入信息躏嚎,完后要把輸入的信息回傳給前一個(gè)界面的情況蜜自,比如修改用戶個(gè)人信息,點(diǎn)擊修改進(jìn)入修改界面卢佣,修改完后到顯示界面顯示修改后的結(jié)果重荠。
5:Block傳值
1.第一頁(yè)中 聲明一個(gè) block, 需要傳入一個(gè)顏色 , 讓當(dāng)前的 view 變色
// 聲明一個(gè) block, 需要傳入一個(gè)顏色 , 讓當(dāng)前的 view 變色
void (^changeColor)( UIColor *color) = ^( UIColor *color){
self . view . backgroundColor = color;
};
2 .? 第一頁(yè)中 //block 傳值 --------- 將 block 給第二個(gè)頁(yè)面
SecondViewController *secondVC = [[ SecondViewController? alloc ]? init ];
//block 傳值 --------- 將 block 給第二個(gè)頁(yè)面
secondVC. block = changeColor;
3.第二頁(yè)中定義 -- 當(dāng) block 變量作為一個(gè)類的屬性 , 必須要使用 copy 修飾
//block 傳值 --------- 將 block 給第二個(gè)頁(yè)面
//block 傳值 --- 當(dāng) block 變量作為一個(gè)類的屬性 , 必須要使用 copy 修飾
@property ( nonatomic? ,? copy ) void (^block)( UIColor? *color);
4.在第二頁(yè)中給block傳值
//block 傳值 --------- 將傳值給 block
NSArray? *array = [ NSArray? arrayWithObjects :[ UIColor? yellowColor ], [ UIColor? cyanColor ], [ UIColor? greenColor ], [ UIColor? brownColor ],? nil ];
self . block ([array? objectAtIndex : rand () %? 4 ]);