首页 > 解决方案 > 在 React Native 中使用 nativeID/使用 RCTRootView 子视图的正确方法是什么?

问题描述

我有一个现有的 iOS 应用程序,我正在使用 react nativeRCTRootView为我的应用程序绘制一些组件。

// swift
private lazy var RNContent: RCTRootView = {
    let mockData:NSDictionary = ["someProps": self.someProps]
    let RNContent = RCTRootView(bridge: self.bridge, moduleName: "RNContent", initialProperties: mockData as [NSObject : AnyObject])!
    return RNContent
  }()

// JS
AppRegistry.registerComponent('RNContent', () => component);

这是我的 RN 层次结构的样子

<View>
  <View>
   <Text />
   <ScrollView /> <--
  <View>
</View>

我想ScrollView在本机方面掌握这一点。根据文档nativeID应该有所帮助。RCTRootView但是,我在 JS 端定义的里面看不到任何子视图。事实上,根视图只有一个名为的子视图RCTRootContentView,它没有任何其他可用的子视图。

RCRootView所以我的问题是在本地获取子视图的正确方法是什么?

我尝试了一些方法,例如使用UIManager'saddUIBlock来获取视图寄存器,但我认为我缺少与'sRCTRootView及其工作原理相关的明显一点。

有趣的是,如果我在我的 RN 层次结构中直接使用本机注册组件(通过 注册RCT_EXTERN_MODULE),我可以看到该组件RCTRootContentView

 RCTExecuteOnUIManagerQueue {
      self.bridge.uiManager.addUIBlock { (uiManager: RCTUIManager?, viewRegistry:[NSNumber : UIView]?) in

        uiManager?.view(forNativeID: "SelfAssignedID", withRootTag: self. RNContent.reactTag) // nil

        viewRegistry?.forEach({ (key: NSNumber, value: UIView) in
          print("Test1: ", key, value.nativeID) // only native components has nativeID, which does makes sense because RCTRootContentView doesn't have subviews... but why not? is there a way to get hold of them? If not, why not?
        })
      }
    }

任何帮助都会有所帮助,谢谢!

标签: iosswiftreact-native

解决方案


事实上,根视图只有一个名为 RCTRootContentView 的子视图,它没有任何其他可用的子视图。

这对我来说似乎是一个问题。JS 中的<Text/>节点应该UITextView在本机内容视图中创建一个子节点。也许尝试实际添加一些内容<Text/><ScrollView/>让它呈现?

我想在本机端获得这个 ScrollView。

您能否就您正在尝试做的事情提供更多背景信息?我有一种感觉nativeIDAPI 不是你想要使用的。


推荐阅读