IOS 代理和block的对比

一.block 方法从子视图向父视图传递值。

    案例:使用block方式子视图向父视图传值。在子视图.h定义block,定义方法。在.m文件实例化方法。然后再主视图实例化子视图是使用block并传入相应的代码,在子视图点击的
                addtarget下执行 父视图的传入的快代码。block这个流程清晰,比代理协议的跳跃性要小。
  1. .定义快代码
    1. //在子视图的.h文件中
    2. //定义快代码
    3. typedefvoid(^textFieldChangedBlock)(NSString*text);
    4. - (id)initWithBlock:(textFieldChangedBlock)block;
     
  2. 定义实例化方法
    1. //实例化方法
    2. -(id)initWithBlock:(textFieldChangedBlock)block
    3. {
    4.    self =[super init];
    5.    if(self){
    6.        _changedBlock = block;
    7.    }
    8.    return self;
    9. }
    10. //定义成员巴拉ing接收块代码
    11. {    textFieldChangedBlock _changedBlock; }
     
  3. 实例化时传入快代码
    1. //在父视图实例化子视图时使用快代码,并把相应代码写入块代码内。
    2. DetailViewController*detail =[[DetailViewController alloc]initWithBlock:^(NSString*text){
    3.        [self.label setText:text];
    4.    }];
    5. //presentViewController是推出是个新的视图 也就是子视图detail
    6. [self presentViewController:detail animated:YES completion:nil];
     
  4. 需要执行块代码
  5.  

  1. //在需要的时候执行父视图传入的快代码:_changedBlock(self.textField.text);
  2. -(void)click
  3. {
  4.    //返回
  5.    _changedBlock(self.textField.text);
  6.    [self dismissViewControllerAnimated:YES completion:nil];
  7. }
 
 

二.代理协议 方法从子视图向父视图传递值。

  1. 子视图定义协议 @protocal

    1. @protocolDetailViewControllerDelegate<NSObject>
    2. -(void)detailDone:(NSString*)text;
    3. @end
     
  2. 定义代理 @property (weak,nonatomic)id<MyHeadDelegate>delegate;

    1. @property(weak,nonatomic) id<DetailViewControllerDelegate>delegate;
     
  3. 代理执行协议方法

    1. -(void)detailDone:(NSString*)text
    2. {
    3. [self.label setText:text];
    4. }
     
  4. 父视图遵守协议 .h文件。<myHeaderDelegate>

    1. @interfaceMainViewController:UIViewController<DetailViewControllerDelegate>
    2. @end
     
  5. 父视图执行代理方法

    1. -(void)click
    2. {
    3. //返回
    4. [_delegate detailDone:self.textField.text];
    5. [self dismissViewControllerAnimated:YES completion:nil];
    6. }
     
  6. 设置代理  [header setDeleagte : self]

    1. -(void)click
    2. {
    3. DetailViewController*detail =[[DetailViewController alloc]init];
    4. [detail setDelegate:self];
    5. [self presentViewController:detail animated:YES completion:nil];
    6. }
     





posted @ 2015-01-16 17:13  大玲D0  阅读(429)  评论(0)    收藏  举报
Write By Seven