BLOCK传值 协议传值

通过使用Block实现从后往前传值

写协议或添加属性

@protocol SecondViewControllerDelegate<NSObject>
-(void)changeColor;
@end
@interface SecondViewController : UIViewController
@property(nonatomic,retain)iddelegate;
//写一条属性,负责接受第一页向第二页传递过来的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];
}

你可能感兴趣的:(BLOCK传值 协议传值)