IOS 代理和block的对比
一.block 方法从子视图向父视图传递值。
案例:使用block方式子视图向父视图传值。在子视图.h定义block,定义方法。在.m文件实例化方法。然后再主视图实例化子视图是使用block并传入相应的代码,在子视图点击的
addtarget下执行 父视图的传入的快代码。block这个流程清晰,比代理协议的跳跃性要小。
- .定义快代码
-
- //在子视图的.h文件中
//定义快代码typedefvoid(^textFieldChangedBlock)(NSString*text);- (id)initWithBlock:(textFieldChangedBlock)block;
- 定义实例化方法
-
//实例化方法-(id)initWithBlock:(textFieldChangedBlock)block{self =[super init];if(self){_changedBlock = block;}return self;}//定义成员巴拉ing接收块代码{ textFieldChangedBlock _changedBlock; }
- 实例化时传入快代码
-
- //在父视图实例化子视图时使用快代码,并把相应代码写入块代码内。
DetailViewController*detail =[[DetailViewController alloc]initWithBlock:^(NSString*text){[self.label setText:text];}];//presentViewController是推出是个新的视图 也就是子视图detail[self presentViewController:detail animated:YES completion:nil];
- 需要执行块代码
-
- //在需要的时候执行父视图传入的快代码:_changedBlock(self.textField.text);
-(void)click{//返回_changedBlock(self.textField.text);[self dismissViewControllerAnimated:YES completion:nil];}
二.代理协议 方法从子视图向父视图传递值。
-
子视图定义协议 @protocal
@protocolDetailViewControllerDelegate<NSObject>-(void)detailDone:(NSString*)text;@end
-
定义代理 @property (weak,nonatomic)id<MyHeadDelegate>delegate;
@property(weak,nonatomic) id<DetailViewControllerDelegate>delegate;
-
代理执行协议方法
-(void)detailDone:(NSString*)text{[self.label setText:text];}
-
父视图遵守协议 .h文件。<myHeaderDelegate>
@interfaceMainViewController:UIViewController<DetailViewControllerDelegate>@end
-
父视图执行代理方法
-(void)click{//返回[_delegate detailDone:self.textField.text];[self dismissViewControllerAnimated:YES completion:nil];}
-
设置代理 [header setDeleagte : self]
-(void)click{DetailViewController*detail =[[DetailViewController alloc]init];[detail setDelegate:self];[self presentViewController:detail animated:YES completion:nil];}

浙公网安备 33010602011771号