React Native向Swift组件传回调属性崩溃,需用何种Objective-C类型?
React Native 自定义Swift组件回调传递崩溃问题
问题详情
从React Native向自定义Swift组件传递回调作为属性,调用该回调时应用崩溃,报错信息如下:
No +[RCTConvert RCTResponseSenderBlock:] function found. -[RCTComponentData createPropBlock:isShadowView:] RCTComponentData.m:258 -[RCTComponentData propBlockForKey:isShadowView:] __37-[RCTComponentData setProps:forView:]_block_invoke __NSDICTIONARY_IS_CALLING_OUT_TO_A_BLOCK__ -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] -[RCTComponentData setProps:forView:] __50-[RCTUIManager createView:viewName:rootTag:props:]_block_invoke.423 __44-[RCTUIManager flushUIBlocksWithCompletion:]_block_invoke __44-[RCTUIManager flushUIBlocksWithCompletion:]_block_invoke.489 __RCTExecuteOnMainQueue_block_invoke _dispatch_call_block_and_release _dispatch_client_callout _dispatch_main_queue_drain _dispatch_main_queue_callback_4CF __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ __CFRunLoopRun CFRunLoopRunSpecific GSEventRunModal -[UIApplication _run] UIApplicationMain main start_sim 0x0
当前使用的Objective-C声明文件:
@interface RCT_EXTERN_MODULE(AppleNativeWebViewManager, RCTViewManager) RCT_EXPORT_VIEW_PROPERTY(urlToLoad, NSString) RCT_EXPORT_VIEW_PROPERTY(matchedUrlCallback, RCTResponseSenderBlock) @end
RCTResponseSenderBlock在原生模块中可正常使用,但作为原生视图的属性类型会导致崩溃,需替换为合适的类型。
解决方法
- 视图组件的回调属性不能用
RCTResponseSenderBlock,需改用**RCTBubblingEventBlock或RCTDirectEventBlock**:RCTBubblingEventBlock:支持事件冒泡,和React合成事件的冒泡机制一致RCTDirectEventBlock:不支持冒泡,仅触发绑定的直接回调
- 修改Objective-C声明文件的属性类型:
@interface RCT_EXTERN_MODULE(AppleNativeWebViewManager, RCTViewManager) RCT_EXPORT_VIEW_PROPERTY(urlToLoad, NSString) // 根据需求选择其中一种类型 RCT_EXPORT_VIEW_PROPERTY(matchedUrlCallback, RCTBubblingEventBlock) @end - 在Swift视图类中对应定义属性,并按要求调用:
class AppleNativeWebView: UIView { var matchedUrlCallback: RCTBubblingEventBlock? func triggerMatchedUrlCallback(with url: String) { // 必须传入字典作为参数,无数据时传空字典[:] matchedUrlCallback?([ "url": url ]) } }
内容的提问来源于stack exchange,提问作者Mr. Robot
相关产品推荐
相关产品推荐

