Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何以确定的顺序添加自定义的本机子视图_Ios_Objective C_React Native_React Native Ios - Fatal编程技术网

Ios 如何以确定的顺序添加自定义的本机子视图

Ios 如何以确定的顺序添加自定义的本机子视图,ios,objective-c,react-native,react-native-ios,Ios,Objective C,React Native,React Native Ios,我有几个自定义的react本机视图,并希望将它们组织在树中,如下所示: <Parent ... > <ChildA ... > <ChildB .. > <ChildC ... /> </ChildB> </ChildA> </Parent> 这样,我可以存储对每个视图的子视图列表的引用,然后覆盖父视图的addSubview,并将父视图向下传递到树中: // Parent.m

我有几个自定义的react本机视图,并希望将它们组织在树中,如下所示:

<Parent ... >
  <ChildA ... >
    <ChildB .. >
      <ChildC ... />
    </ChildB>
  </ChildA>
</Parent>
这样,我可以存储对每个视图的子视图列表的引用,然后覆盖父视图的
addSubview
,并将父视图向下传递到树中:

// Parent.m

- (void)addSubview:(UIView *)view {
  if ([view isKindOfClass:[Child class]]) {
    [((Child *)view) addParent:self];
  }
}
仅当添加子视图的顺序如下时,此操作才有效:

ChildC->ChildB->ChildA->Parent

这就是我对React树的期望,这就是它在Android中的工作原理(尽管它与ViewGroupManager的策略略有不同),但在iOS中似乎没有确定的顺序

据我所知,原因是在rctuimanger.m
\u dispatchChildrenDidChangeEvents
中,此处的
标记
数组并不总是按预期顺序排列,因为它是为shadows视图(这是一个哈希表)的标记确定的

-(void)\u dispatchChildrenDidChangeEvents
{
如果(_shadowViewsWithUpdatedChildren.count==0){
返回;
}
NSHashTable*shadowview=\u shadowview更新的孩子;
_shadowViewsWithUpdatedChildren=[NSHashTable weakObjectsHashTable];
NSMutableArray*标记=[NSMutableArray阵列容量:shadowViews.count];
用于(RCTShadowView*阴影视图中的阴影视图){
[shadowView DidUpdateReactSubView];
[tags addObject:shadowView.reactag];
}
[自添加块:^(_未使用的RCTUIManager*uiManager,NSDictionary*viewRegistry){
用于(NSNumber*标签中的标签){
UIView*view=viewRegistry[tag];
[view DidUpdateReactSubView];
}
}];
}
这是React原生行为还是预期行为的问题?正确的方法是什么?我对React Native不太熟悉,也绝对不熟悉iOS开发


也许我应该重写另一个方法或侦听一个事件。

不清楚为什么要这样做,但UIView已经有了一个列出所有子视图的
子视图
属性和一个列出其父视图的
超级视图
。根据您的要求,您可以遍历UIView结构来访问子视图或父视图。更正,
子视图
而不是
子视图
@MikeM,这就是我试图做的,但我想问题是“我什么时候可以做这件事?”。我想我可以使用父视图的addSubview方法,然后遍历UIView结构,但问题是有时子视图还没有添加它们的子视图,因此我需要等待React Native来解决渲染或其他问题。不确定是否有此iOS事件。我认为您可以覆盖
layoutSubviews
方法-到那时应该创建子视图。@MikeM哇,我想这可能就是我要找的!。。我需要弄清楚当视图被删除时该怎么做(也有拆除的逻辑),但我认为这可能会起作用,谢谢
// Parent.m

- (void)addSubview:(UIView *)view {
  if ([view isKindOfClass:[Child class]]) {
    [((Child *)view) addParent:self];
  }
}
- (void)_dispatchChildrenDidChangeEvents
{
  if (_shadowViewsWithUpdatedChildren.count == 0) {
    return;
  }

  NSHashTable<RCTShadowView *> *shadowViews = _shadowViewsWithUpdatedChildren;
  _shadowViewsWithUpdatedChildren = [NSHashTable weakObjectsHashTable];

  NSMutableArray *tags = [NSMutableArray arrayWithCapacity:shadowViews.count];

  for (RCTShadowView *shadowView in shadowViews) {
    [shadowView didUpdateReactSubviews];
    [tags addObject:shadowView.reactTag];
  }

  [self addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
    for (NSNumber *tag in tags) {
      UIView<RCTComponent> *view = viewRegistry[tag];
      [view didUpdateReactSubviews];
    }
  }];
}