Ios 如何以确定的顺序添加自定义的本机子视图
我有几个自定义的react本机视图,并希望将它们组织在树中,如下所示: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
<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];
}
}];
}