分享

ios开发之block传值和委托协议传值的比较

 尹亮亮 2015-05-05
block传值和委托协议传值的比较

1  使用委托(delegate)和协议(protocol)在两个viewController间传值

protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。 
delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
当一个A view 里面包含了B view, B view需要修改A  view界面,那么这个时候就需要用到委托了。
需要几个步骤:
1 首先定一个协议
2 a view实现协议中的方法
3 b view设置一个委托变量
4 把b view的委托变量设置成a view
5 事件发生后,用委托变量调用a view中的协议方法


例子:
使用委托(delegate)和协议(protocol)在连个页面间传值
实现效果:用导航控制器从b页面返回a页面,a页面的label上显示b页面传回的字符串


A页面.h文件

#import 

#import "UploadDetailViewController.h"


@interface UploadViewController : UIViewController <<span style="color: rgb(79, 129, 135);">UIViewUploadDelegate>

@property (nonatomic, MY_RETAIN) IBOutlet UILabel *label;

@property (nonatomic, MY_RETAIN) IBOutlet UIButton *button;

-(IBAction)buttonClicked:(id)sender;

@end


A页面.m文件

-(IBAction)buttonClicked:(id)sender

{

    UploadDetailViewController *uploadDetailViewController =[[UploadDetailViewControlleralloc]initWithNibName:@"UploadDetailViewController" bundle:nil];

    uploadDetailViewController.uploadDelegate self;

    [self.navigationController pushViewController:uploadDetailViewController animated:YES];

}


-(void)passValue:(NSString*)value

{

    _label.text = value;

}



B页面.h文件

#import 


@protocol UIViewUploadDelegate <<span style="color: rgb(112, 61, 170);">NSObject>

@required

-(void)passValue:(NSString*)value;

@optional

-(void)test;

@end


@interface UploadDetailViewController : UIViewController

@property(nonatomicMY_RETAINid <<span style="color: rgb(79, 129, 135);">UIViewUploadDelegate> uploadDelegate;

@end


B页面.m文件

-(void)goBackAction

{

    [_uploadDelegate passValue:@"hello world!"];

    [self.navigationController popViewControllerAnimated:YES];

}





2 用block在两个viewController间传值

例子:
使用block在连个页面间传值
实现效果:用导航控制器从b页面返回a页面,a页面的label上显示b页面传回的字符串


A页面.h文件

#import 

#import "UploadDetailViewController.h"


@interface UploadViewController : UIViewController

@property (nonatomic, MY_RETAIN) IBOutlet UILabel *label;

@property (nonatomic, MY_RETAIN) IBOutlet UIButton *button;

-(IBAction)buttonClicked:(id)sender;

@end


A页面.m文件

-(IBAction)buttonClicked:(id)sender

{

 

    UploadDetailViewController *uploadDetailViewController = [[UploadDetailViewControlleralloc]initWithNibName:@"UploadDetailViewController"bundle:nil];

    [uploadDetailViewController setHandlerBlock:^(NSString *str){

        _label.text = str;

    }];

    [self.navigationController pushViewController:uploadDetailViewController animated:YES];

}



B页面.h文件

#import 


@interface UploadDetailViewController : UIViewController

typedef void (^PassValueBlock)(NSString* str);

@property(nonatomicstrongPassValueBlock block;

- (void)setHandlerBlock:(PassValueBlock)block;
@end


B页面.m文件

- (void)setHandlerBlock:(PassValueBlock)block {

     self.block = block;

}

//按钮响应事件

 

-(void)goBackAction

    

    if (self.block)

          self.block(@"hello world!" );

    [self.navigationControllerpopViewControllerAnimated:YES];

}


- (void)dealloc

{

    Block_release(_block);

    [super dealloc];

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多