码迷,mamicode.com
首页 > 移动开发 > 详细

IOS 代理和block的对比

时间:2015-01-16 19:01:38      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

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

    案例:使用block方式子视图向父视图传值。在子视图.h定义block,定义方法。在.m文件实例化方法。然后再主视图实例化子视图是使用block并传入相应的代码,在子视图点击的
                addtarget下执行 父视图的传入的快代码。block这个流程清晰,比代理协议的跳跃性要小。
  1. .定义快代码
    1. //在子视图的.h文件中
    2. //定义快代码
    3. typedef void(^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. 需要执行块代码
  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. @protocol DetailViewControllerDelegate <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. @interface MainViewController : 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. }





IOS 代理和block的对比

标签:

原文地址:http://www.cnblogs.com/zhjl/p/4229280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!