您的位置:首页 > 其它

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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: