zoukankan      html  css  js  c++  java
  • 整理IOS中Block用作属性、传值、回调用法

    1.block用作属性 封装一段代码

    在模型类中声明block属性 ,注意block的属性要使用copy否则会出问题

    @property (copy, nonatomic) void (^actionBlock)();

    
    
    

    @property (copy, nonatomic) void (^actionWithPapameterBlock)(int papameter);

    @property (copy,nonatomic) NSString *(^actionToReturnStirng)();

     

    其他控制器创建模型类对象,并且为block属性赋予一段代码 。曾经为cell的模型类添加了block属性后,将点击cell跳转的控制器封装到块代码中,调用起来十分方便。

     //无返回值无参数block

        _model = [[Modelalloc]init];

        

        _model.actionBlock = ^{

            NSLog(@"actionBlock");

        };

        

        //无返回值有参数block

        _model.actionWithPapameterBlock = ^(int a){

            NSLog(@"%d",a);

        };

        

        //有返回值

        _model.actionToReturnStirng = ^{

          

            return@"hello";

        };

    在其他方法中调用block

    - (IBAction)tapBtn:(id)sender

    {

        _model.actionBlock();

        

        _model.actionWithPapameterBlock(10);

        

         NSLog(@"%@",_model.actionToReturnStirng());

        

    }

    2.控制器传值 

     在需要传值的控制器定义block,此处传递UITextField中输入的NSString,并且声明初始化方法

    typedefvoid(^textFieldChangedBlock)(NSString *text);

    -(id)initWithBlock:(textFieldChangedBlock)block;

    实现文件中用成员变量记录block

    @implementation Model{

        textFieldChangedBlock _changedBlock;

    }

    - (id)initWithBlock:(textFieldChangedBlock)block

    {

        self = [super init];  

        if (self) {

            _changedBlock = block;

        }

          return self;

    }

    执行block

    - (void)click

    {    //返回

         _changedBlock(self.textFiled.text);

         [self dismissViewControllerAnimated:YES completion:nil];

    }

    Block传值,在需要显示textfield内容的控制器实例化存储有block的类

        DetailViewController *detail = [[DetailViewController alloc]initWithBlock:^(NSString *text) {

            

            [self.label setText:text];

        }];

    3.曾在用sprite kit加载scene素材时用到了block

    //主控制器中利用自定义scene提供的方法加载场景素材

        [scene loadSceneAssetsWithCompletionHandler:^{

            

            scene.scaleMode =SKSceneScaleModeAspectFill;

            [skView presentScene:scene];

        }];

    // block实现

    typedefvoid(^AssetLoadCompletionHandler)(void);

    - (void)loadSceneAssetsWithCompletionHandler:(AssetLoadCompletionHandler)callback

    {

          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

              

              [selfloadSceneAssets]; 

              

              if (callback) {     

                 dispatch_async(dispatch_get_main_queue(), ^{

                    callback();//回调

                  });

              }     

          });

    }

  • 相关阅读:
    第一次作业
    第一次作业
    第一次作业
    第一次作业
    随笔初谈
    第一次作业
    第一次作业
    第一次班级作业
    C语言感想---第一次作业
    C语言入门
  • 原文地址:https://www.cnblogs.com/jordanYang/p/5599356.html
Copyright © 2011-2022 走看看