IOS 代理和block的对比

it2022-05-09  24

一.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];}  

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/zhjl/p/4229280.html


最新回复(0)