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

              });

          }     

      });

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
iOS,可以通过WKWebView与JavaScript进行交互传值。以下是一些常见的方法: 1. 使用JavaScriptCore框架:在iOS 7及以上版本,可以使用JavaScriptCore框架来实现WKWebView与JS的交互传值。具体实现步骤如下: (1)在iOS创建一个JSContext实例,通过该实例可以操作JS环境。 (2)将JSContext实例设置到WKWebView的配置对象。 (3)在JS调用iOS方法时,可以通过window.webkit.messageHandlers对象进行调用,例如window.webkit.messageHandlers.methodName.postMessage(params)。 (4)在iOS,可以通过WKScriptMessageHandler代理方法来接收JS传递的消息,并进行处理。 2. 使用WKScriptMessageHandler协议:在iOS 8及以上版本,可以通过WKScriptMessageHandler协议来实现WKWebView与JS的交互传值。具体实现步骤如下: (1)在WKWebView的配置对象设置WKUserContentController的代理对象,并添加需要监听的JS方法名。 (2)在JS调用iOS方法时,可以通过window.webkit.messageHandlers对象进行调用,例如window.webkit.messageHandlers.methodName.postMessage(params)。 (3)在iOS,可以通过WKScriptMessageHandler代理方法来接收JS传递的消息,并进行处理。 无论使用哪种方法,都需要注意JS和iOS之间传递的数据类型和格式。通常,JS传递的是字符串类型的数据,在iOS需要进行解析和转换。同时,为了避免安全问题,需要对JS传递的数据进行校验和过滤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值