整理IOS中Block用作属性传值回调用法

Posted JDYang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整理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 = ^{

      

        [email protected]"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();//回调

              });

          }     

      });

}

以上是关于整理IOS中Block用作属性传值回调用法的主要内容,如果未能解决你的问题,请参考以下文章

界面通信之block传值

block和delegate的选择

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

iOS 页面间几种传值方式(属性,代理,block,单例,通知)(转)