整理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();//回調

              });

          }     

      });

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM