You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:35:21