使用Block传值

         相对于delegate传值,Block传值相对简单方便,而delegate却需要写一大堆东西才能完成后一个界面向前一个界面的传值。但是Block也并非完全没有缺陷,它的使用成本相对delegate来说更高,Block需要将使用的数据从栈内存拷贝到堆内存,而delegate只保存了一个对象的指针,然后回调。delegate出厂日期相对久远,在各种语言中都相对成熟。但是很多情况下,Block都可代替delegate使用。

         使用Block传值的一个简单例子:将第二个视图中的textfeild的字符串传给第一个视图的label上。

效果图:

第二个视图

@interface
typedef void (^textBlock)(NSString *name);//创建block
@property (nonatomic,copy)textBlock myblock;
//@property (nonatomic,copy)void(^mybolck)(NSString *name);//也可在property中直接创建

@implementation
//在返回按钮的事件里
myblock(_textF.text);//将textfeild的字符串传给block
[self dismissViewControllerAnimated:YES completion:nil];

第一个视图

LastPage *page = [[LastPage alloc]init];//初始化第二个视图
    page.myblock = ^(NSString *name){
        _labelT.text = name;//设置第一个视图的lable值为block的参数
        _labelT.backgroundColor = [UIColor redColor];//在block的实现中设置label的背景颜色
    };

另外也可以通过设置方法,将block设置为方法内的参数

视图二

typedef void(^colorBlock)(UIColor *green);
@interface Humen : NSObject
+(void)changeColor:(colorBlock)block;
@end

@implementation Humen
+(void)changeColor:(colorBlock)block
{
    UIColor *green = [UIColor greenColor];
    block(green);
}
@end

视图一:在按钮实现中调用,按下后可变色(效果图如上)

[Humen changeColor:^(UIColor *green) {
        [sender setBackgroundColor:green];
    }];

另外:__block关键字的使用

在Block的{}体内,是不可以对外面的变量进行更改的,如果更改会出现如下错误:Variable is not assigning (missing __block type)

 NSString *mytitle = @"moxue";
    void (^newBlock)(NSString *str) = ^(NSString *str){
        mytitle = str;
    };

这是因为在初始化block以后,它会默认将和它一起初始化的变量认为是常量,如果要修改外部变量值,只需要在mytitle之前加上一个__block便不会报错

__block NSString *mytitle = @"moxue";
    void (^newBlock)(NSString *str) = ^(NSString *str){
        mytitle = str;
    };

 

转载于:https://www.cnblogs.com/moxuexiaotong/p/4966969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值