BLOCK传值 协议传值
2015-08-26 17:47
471 查看
通过使用Block实现从后往前传值
写协议或添加属性
@protocol SecondViewControllerDelegate<NSObject> -(void)changeColor; @end @interface SecondViewController : UIViewController @property(nonatomic,retain)id<SecondViewControllerDelegate>delegate; //写一条属性,负责接受第一页向第二页传递过来的block //@property(nonatomic,copy)void(^block)(); //@property(nonatomic,copy)void(^block)(NSString *); @property(nonatomic,copy)void(^block)(NSMutableArray *); @end
这是一个按钮的点击方法,当触发点击事件时实现方法
-(void)click:(UIButton *)button{ [self.navigationController popViewControllerAnimated:YES]; // [self.delegate changeColor]; // 3.调用传过来的block // self.block(@"刘山山"); NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil]; // 用block来传递数组 self.block(arr); }
实现单击事件的方法用来调用block
-(void)click:(UIButton *)button{ // 没有参数,没有返回值的block // 通过block改变self.view的背景颜色 // void (^block)() = ^(){ // NSLog(@"测试"); //// 改变颜色 //// self.view.backgroundColor = [UIColor colorWithRed:arc4random() % 266 / 255.0 green:arc4random() % 266 / 255.0 blue:arc4random() % 266 / 255.0 alpha:1]; // // }; //// 调用 // block(); // 通过block实现从后向前传值 // block传值不需要返回值,因为调用更需要返回值,所以传值的时候只要参数,不需要返回值 // void(^block)(NSString *) = ^(NSString *str){ // NSLog(@"%@",str); // }; void(^block)(NSMutableArray *) = ^(NSMutableArray *arr){ // 传过来的数据都在block中处理 for (NSInteger i = 0; i < arr.count; i++) { NSLog(@"%@",arr[i]); } }; SecondViewController *secVC = [[SecondViewController alloc]init]; secVC.block = block; [self.navigationController pushViewController:secVC animated:YES]; [secVC release]; // secVC.delegate = self; // 2.把block通过属性传到第二页 }
block传值练习
typedef void (^Block)(NSString *); @interface SecondViewController : UIViewController @property(nonatomic,copy)Block block; @end
实现block传值的方法
@implementation SecondViewController -(void)dealloc{ //这个是block自己的release方法 Block_copy(_block); [super dealloc]; } //点击事件,通过block方式传递字符串 -(void)click:(UIButton *)button{ [self.navigationController popToRootViewControllerAnimated:YES]; self.block(@"跳涧虎 陈达"); }
被传值页面的实现方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ // 写一个参数是nsstring *的block void(^block)(NSString *) = ^(NSString *str){ NSLog(@"%@",str); [self.arr addObject:str]; // 刷新tableView UITableView *tableview = (UITableView *)[self.view viewWithTag:1000]; [tableview reloadData]; }; #pragma mark block作为属性的时候,为了防止block进入到栈区,栈区内存不需要我们进行管理,很可能出现block消失的情况,所以需要拷贝一份到堆区,这样能防止block在用的时候消失 SecondViewController *secVC = [[SecondViewController alloc]init]; secVC.block= block; [self.navigationController pushViewController:secVC animated:YES]; [secVC release]; }
相关文章推荐
- KEIL之新版V5使用
- 论C++的静态联编和动态联编
- DuiLib属性
- css图片上文字居中,兼容微信
- Error:Android Source Generator: [sdk] Android SDK is not specified.
- 2015.8.26
- XP下Winform背景透明问题
- java校验导入的模板
- 运维屌丝回答网传Linux运维面试题(四)
- 适配iPhone6和6P UITableView分割线会闪动(拖动UITableView的时候,分割线 一会儿变粗一会儿变细)解决办法
- 字典类型的json字符串中的key要用双引号,而不能用单引号
- CSS3 选择器
- CSU 1506 酷酷的单词
- 视频、音频打时间戳的方法及其音视频同步(播放)原理
- 使用36-pin的STM32输出VGA, VGA output using a 36-pin STM32
- NSNumber简略了解
- [WPF] 为Style 里的button添加鼠标点击响应事件
- HTML5 缓存: cache manifest
- Service Station - An Introduction To RESTful Services With WCF
- Linux下vsftpd安装以及配置FTP虚拟用户实践