【问题标题】:ios/objective c: Iterate over UIView.subviews shows partial views onlyios/objective c:迭代 UIView.subviews 仅显示部分视图
【发布时间】: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“快速查看”做了什么或改变了什么?

标签: ios objective-c uiview


【解决方案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”阶段之后添加了子视图和组件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多