ios/objective c:迭代 UIView.subviews 仅显示部分视图

Posted

技术标签:

【中文标题】ios/objective c:迭代 UIView.subviews 仅显示部分视图【英文标题】:ios/objective c: Iterate over UIView.subviews shows partial views only 【发布时间】:2018-10-12 13:37:48 【问题描述】:

我从here 学到了如何在 UIView 上迭代目标 c / 记录视图层次结构,但问题太老了,无法评论:

// UIView+HierarchyLogging.h
@interface UIView (ViewHierarchyLogging)
- (void)logViewHierarchy;
@end

// UIView+HierarchyLogging.m
@implementation UIView (ViewHierarchyLogging)
- (void)logViewHierarchy

   NSLog(@"%@", self);
   for (UIView *subview in self.subviews)
   
       [subview logViewHierarchy];
   

@end

// In your implementation
[myView logViewHierarchy];

我的问题:在调试模式下,当且仅当我在 for 循环中设置断点并在 XCode 中单击“快速查看”时,一切正常。之后,所有子视图都被正确记录。在普通运行中,仅记录几个子视图。我做错了什么?

提前致谢 乔

【问题讨论】:

嗯...我没有看到任何问题。您可能需要发布更多信息,或者建立一个简单的项目来重现它? 不,抱歉,我不能。该行为是我无法共享的第三方 sdk 的一部分。问题是:XCodes“快速查看”做了什么或改变了什么? 【参考方案1】:

我认为链接的答案在理论上是正确的,但是当您真正想要理解输出时它有点不切实际。在输出中,您看不到任何层次结构,因为您看不到哪个视图是哪个视图的子视图。您至少应该使层次结构有点可见。例如:

some-view
another-view
whatever
foo
hello you

看起来不太好。最好是这样的:

(V:) some-view
  (V:) another-view
    (V:) whatever
    (V:) foo
  (V:) hello you

在第二个 sn-p 中,您看到“another-view”和“hello you”都是“some-view”的子视图。您还可以看到 logViewHierarchy 只被调用了一次。在第一个(假设的)调试输出中,无法知道 logViewHierarchy 被调用的频率。通过输出中的“(V:)”,您可以知道哪些调试输出行来自对 logViewHierarchy 的调用,哪些调试输出行来自其他地方!用NSLog(@"%@", obj); 记录一个对象几乎从来都不是一个好主意;开头应该总是有一条日志消息,以便您可以在源代码中搜索它。 (大多数互联网教程使用NSLog 的方式完全不适合生产环境,恕我直言。)

// UIView+HierarchyLogging.m
@implementation UIView (ViewHierarchyLogging)
- (void)_logViewHierarchyWithIndent:(NSString *)indentation

    NSLog(@"%@(V:) %@", indentation, self);
    NSString *more_indentation = [indentation stringByAppendingString:@"  "];
    for(UIView *v in self.subviews) 
        [v _logViewHierarchyWithIndent: more_indentation];
    

- (void)logViewHierarchy

    [self _logViewHierarchyWithIndent:@""];

@end

【讨论】:

【参考方案2】:

记录子视图的代码是正确的,Michaels 的回答显示了如何以结构化的方式进行。问题是第三方 sdk 在我记录的“viewDidAppear”阶段之后添加了子视图和组件。

还是谢谢你,很抱歉给你带来了困惑

【讨论】:

以上是关于ios/objective c:迭代 UIView.subviews 仅显示部分视图的主要内容,如果未能解决你的问题,请参考以下文章

将Square UIView划分为横截面iOS Objective C

IOS/Objective-C:检测 UIVIew 上的滑动和屏幕相同位置的按钮触摸

只要 UIView 可见,我如何使 UIView 出现在我的所有应用程序屏幕上 iOS Objective-c

IOS/Objective-C:子视图的子视图不显示

IOS/Objective-C:改变图像视图的色调

iOS Objective C - UITableView性能问题