美文网首页
iOS block分析

iOS block分析

作者: kwalter | 来源:发表于2016-05-04 17:59 被阅读31次

    学习block从迷惑到渐渐的清晰,在这里跟大家分享一下

    block的创建

    block可以在函数内定义也可以在函数外定义
    1.在文件范围内定义:
    typedef void(^block名字)(block的参数,可以多个)
    2.在函数内定义:
    void(^myBlock)(NSString* str) = ^(NSString* str){ NSL(@"%@",str); };

    block相当于一个匿名的函数,没有调用的话不会执行

    __block的使用:

    在block中引用外部变量的时候,其实是在没有运行时就捕捉到外部变量的值,当block内试图改变外部变量的值的时候,这时候编译器就提示x变量错误信息:Variable is not assigning (missing __block type);这时候在变量的声明是加__block就可以避免这种情况,如:__block NSString* name = @"张三";
    通常block是用来跨越两个类来使用的,比如作为属性或者参数的话就可以跨越两个类使用了
    比如在两个类之间相互传值:
    假设需求:在一个rootViewController中点击跳转到另一个页面,在另一个页面NextViewController中的textFelix中填写后点击返回,将值传给rootViewController中的navigationItem.title
    1.使用代理/协议实现

    //在NextViewController.h中
    //添加NextViewController的协议
    @protocol NextViewControllerDelegate<NSObject>
    @optional
    -(void)nextViewControllerWithTitle:(NSString*)str;
    @end
    @interface NextViewController:UIViewController
    @property(nonatomic,assign)id<NextViewControllerDelegate> delegate;
    @end

    //在NextViewController.m文件中
    //在点击返回的按钮激发的方法中
    -(void)pop{
    if(self.delegate && [self.delegate respondsToSelector:@selector(nextViewControllerWithTitle:)]){
    [self.delegate nextViewControllerWithTitle:self.textField.text];
    }
    [self.navigationController popViewControllerAnimated:YES];
    }

    在rootViewController中:

    //导入NextViewController.h头文件

    import “NextViewController.h”

    //继承NextViewControllerDelegate协议
    @interface rootViewController()<NextViewControllerDelegate>

    @end
    //在点击跳转的方法中
    -(void)push{
    NextViewController* nextVC = [[NextViewController alloc]init];
    nextVC.delegate = self;
    [self.navigationController pushViewController:nextVC animated:YES];
    }
    -(void)nextViewControllerWithTitle:(NSString*)str{
    self.navigationItem.title = str;
    }
    2.使用block进行传值:

    //在NextViewController.h中
    @interface : UIViewController
    @property(nonatomic,copy)void(^nextViewControllerBlock)(NSString* str);

    @end

    //NextViewController.m
    //在返回函数中
    -(void)pop{
    if(self.nextViewControllerBlock){
    self.nextViewControllrBlock(self.textField.text);
    }
    [self.navigationController popViewControllerAnimated:YES];
    }

    //rootViewController.m
    //跳转函数中
    -(void)push{
    NextViewController* nextVC = [[NExtViewController alloc]init];
    nextVC.nextViewControllerBlock = ^(NSString* str){
    self.navigationItem.title = str;
    };
    }

    使用block来传值比delegate要简洁的多,实际上,block就是用来代替Delegate的功能的

    相关文章

      网友评论

          本文标题:iOS block分析

          本文链接:https://www.haomeiwen.com/subject/iporrttx.html