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(nonatomic, MY_RETAIN) id <<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(nonatomic, strong) PassValueBlock 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];
}
|