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 上的滑动和屏幕相同位置的按钮触摸