回答
这里是一个NSView类别:
@interface NSView (MDRecursiveSubviews)
- (NSArray *)allSubviews;
@end
@implementation NSView (MDRecursiveSubviews)
- (NSArray *)allSubviews {
NSMutableArray *allSubviews = [NSMutableArray arrayWithObject:self];
NSArray *subviews = [self subviews];
for (NSView *view in subviews) {
[allSubviews addObjectsFromArray:[view allSubviews]];
}
return [[allSubviews copy] autorelease];
}
@end
随着我视图层次创建了一个快速笔尖文件,它印刷本:
[RecursiveSubviewsAppDelegate awakeFromNib] allSubviews == (
"<NSView: 0x10390dfd0>",
"<NSView: 0x103c07ae0>",
"<NSView: 0x100129cc0>",
"<NSButton: 0x100115ce0>",
"<NSButton: 0x100116900>",
"<NSButton: 0x1001165c0>",
"<NSButton: 0x100116130>",
"<NSButton: 0x100114ad0>",
"<NSButton: 0x100115910>",
"<NSButton: 0x100115090>",
"<NSScrollView: 0x103b07a30>",
"<NSClipView: 0x103b07d40>",
"<NSTextView: 0x103b083c0>\n
Frame = {{0.00, 0.00}, {159.00, 58.00}},
Bounds = {{0.00, 0.00}, {159.00, 58.00}}\n
Horizontally resizable: NO, Vertically resizable: YES\n
MinSize = {159.00, 58.00}, MaxSize = {463.00, 10000000.00}\n",
"<NSScroller: 0x1001145b0>",
"<NSScroller: 0x100114840>",
"<NSScrollView: 0x10390ea00>",
"<NSClipView: 0x10390ef10>",
"<NSTableView: 0x10390f570>",
"<NSScroller: 0x103b06f10>",
"<NSScroller: 0x103b07460>",
"<NSClipView: 0x1039105d0>",
"<NSTableHeaderView: 0x103910300>",
"<_NSCornerView: 0x103911c20>"
一个问题的笔记我要补充的是,这是我不清楚如何做到这一点是有用的,但作为调试工具。但即使如此,可能还有更简单的做事方式。
适用于iOS:NS - > UI。 – clozach 2012-08-28 16:24:46
如果我正确理解了你,你将不得不创建一个递归调用自己的方法。事情是这样的:
- (NSArray *)allSubviewsOfView:(NSView *)view
{
NSMutableArray *subviews = [[view subviews] mutableCopy];
for (NSView *subview in [view subviews])
[subviews addObjectsFromArray:[self allSubviewsOfView:subview]]; //recursive
return subviews;
}
你会再调用类似
NSArray *allSubviewsOfWindow = [self allSubviewsOfView:[window contentView]];
,让您的观点。 (不要忘记,如果你不使用GC做内存管理。)
递归方法将永远不会像您设计的那样结束。 – Moshe 2011-03-27 03:10:11
谢谢,虽然这将无限地递归,直到堆栈溢出,我会添加一个基本情况。但这是最好的方式吗? – user635064 2011-03-27 03:32:23
@Enchilada:不要忘记释放阵列。 @ user635064:不,它不会无限递归。如果你添加了一个视图作为它自己的子视图的子视图,那么它可能是一个闭环,不能从窗口的'contentView'到达。 – 2011-03-27 03:41:45
不确定其他答案中的无限递归,但是当您在其上进行快速枚举时绝对不能修改数组。下面是我为iOS编写的一个方法,它遍历所有子视图,直到没有更多的东西需要探索。我认为相同或相似的工作对于NSView。希望这可以帮助。
(编辑:现在......如果我刚刚看了一点点进一步下跌我的搜索结果,我早就发现了这个非常简单的方法,首先做到这一点:How can I loop through all subviews of a UIView, and their subviews and their subviews)
- (NSMutableArray *)allSubviewsInView:(UIView *)parentView {
NSMutableArray *allSubviews = [[NSMutableArray alloc] initWithObjects: nil];
NSMutableArray *currentSubviews = [[NSMutableArray alloc] initWithObjects: parentView, nil];
NSMutableArray *newSubviews = [[NSMutableArray alloc] initWithObjects: parentView, nil];
while (newSubviews.count) {
[newSubviews removeAllObjects];
for (UIView *view in currentSubviews) {
for (UIView *subview in view.subviews) [newSubviews addObject:subview];
}
[currentSubviews removeAllObjects];
[currentSubviews addObjectsFromArray:newSubviews];
[allSubviews addObjectsFromArray:newSubviews];
}
NSLog(@"\n%d total subviews:\n%@",allSubviews.count, allSubviews);
return allSubviews;
}
登录从样品查看结果:
18 total subviews:
(
"<UIRoundedRectButton: 0x6a7a590; frame = (26 20; 72 37); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x6a772d0>>",
"<UISwitch: 0x6a7f930; frame = (26 76; 79 27); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x6a7fa20>>",
"<UIImageView: 0x685e4a0; frame = (82 20; 139 139); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x685eca0>>",
"<UITextView: 0x6893e40; frame = (20 196; 192 79); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; layer = <CALayer: 0x687c330>; contentOffset: {0, 0}>",
"<UIView: 0x6a88af0; frame = (26 304; 198 123); autoresize = RM+BM; tag = 1; layer = <CALayer: 0x6a88b20>>",
"<UIButtonLabel: 0x6a7f410; frame = (0 0; 0 0); clipsToBounds = YES; hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x6a7f4d0>>",
"<_UISwitchInternalView: 0x6a7fa50; frame = (-1 0; 79 27); layer = <CALayer: 0x6a79b90>>",
"<UITextSelectionView: 0x6894070; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x68940d0>>",
"<UIImageView: 0x68924b0; frame = (0 72; 192 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x6892520>>",
"<UIImageView: 0x6894100; frame = (185 0; 7 79); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x6894180>>",
"<UIWebDocumentView: 0x7416600; frame = (0 0; 192 394); text = 'Lorem ipsum dolor sit er ...'; opaque = NO; userInteractionEnabled = NO; layer = <UIWebLayer: 0x6895330>>",
"<UIView: 0x6a88b50; frame = (10 10; 80 80); autoresize = W+H; tag = 2; layer = <CALayer: 0x6a88b80>>",
"<UIImageView: 0x6a80610; frame = (1 0; 77 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x6a80650>>",
"<UIView: 0x6a806f0; frame = (1 0; 77 27); clipsToBounds = YES; alpha = 0; layer = <CALayer: 0x6a80720>>",
"<UIView: 0x6a88fa0; frame = (5 5; 50 50); autoresize = W+H; tag = 3; layer = <CALayer: 0x6a88fd0>>",
"<UIImageView: 0x6a808e0; frame = (-2 0; 79 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x6a84d30>>",
"<UIImageView: 0x6a84c00; frame = (-2 0; 131 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x6a84d90>>",
"<UIImageView: 0x6a84c40; frame = (49 0; 29 27); userInteractionEnabled = NO; layer = <CALayer: 0x6a84c80>>"
)
NSArray *arrofView = [[self view] subviews];
该OP正在寻找子视图_and_他们的子视图(等等,我想)。 – Monolo 2012-07-13 20:59:06
有可以在NSView
被发送到打印控制层次悄悄话。
[NSView _subtreeDescription]
为您提供了NSView
(即其子女及其子女)的整个层次结构。
static void dumpViews(NSView* v, int level) {
NSString* indent = @"";
for (int i = 0; i < level; i++) {
indent = [indent stringByAppendingString:@" "];
}
NSLog(@"%@%@ %@", indent, [v class], NSStringFromRect(v.frame));
if (v.subviews != null) {
for (id s in v.subviews) {
dumpViews(s, level + 1);
}
}
}
- (void) windowControllerDidLoadNib: (NSWindowController*) controller {
NSWindow* window = controller.window;
dumpViews(window.contentView, 0);
...
如果视图内有视图,上述解决方案将不起作用。我们需要做一个递归解决方案,如下所示。
-(void) printViewHierarchy: (UIView *) view withTag: (NSInteger) tag {
if (view == nil) {
return;
}
if (view == nil || [view tag] == tag) {
NSLog(@"%@", view);
return;
}
for (UIView * subview in [view subviews]) {
[self printViewHierarchy: subview withTag: tag];
}
}
- (void) findAllViews {
UIView * baseView = [UIView new];
[baseView setTag: 1];
UIView * secondRowA = [UIView new];
[secondRowA setTag: 2];
UIView * secondRowB = [UIView new];
[secondRowB setTag: 3];
UIView * thirdRowA = [UIView new];
[thirdRowA setTag: 4];
UIView * thirdRowB = [UIView new];
[thirdRowB setTag: 5];
[secondRowA addSubview: thirdRowA];
[secondRowB addSubview: thirdRowB];
[baseView addSubview: secondRowA];
[baseView addSubview: secondRowB];
[self printViewHierarchy: baseView withTag: 6];
}
- 1. 如何删除子视图(或视图的所有子视图)
- 2. 在NSWindow中获取鼠标上的子视图的NSPoint
- 3. 获取回收视图子视图
- 4. 获取子视图包含视图
- 5. NSWindow集合视图
- 6. android获得视图的所有子视图
- 7. 将NSWindow显示为NSView的子视图
- 8. 如何获取包含子视图在内的所有视图总数
- 9. 透明NSWindow,但不是子视图?
- 10. Appium - 如何在Android滚动视图中获取所有视图
- 11. 在所有视图中获取请求
- 12. 获取所有数据树视图?
- 13. Ember - 在父视图和子视图之间获取值
- 14. 如何获取子视图
- 15. 从子视图获取CGContextRef
- 16. 在子子视图中获取视图的框架
- 17. 删除NSWindow内容视图
- 18. 在NSWindow中切换视图
- 19. 获取线性布局内的所有子视图
- 20. 获取单元格onClick在UICollectionView中的所有子视图swift
- 21. iOS - 删除所有子视图后重新添加子视图
- 22. 查看所有内容:UIWindow子视图VS UIViewController子视图
- 23. ExtJS:视图的所有子视图的选择器
- 24. CodeIgniter - 容器视图获取子视图所需的脚本列表(js)
- 25. 如何删除当前视图以外的所有子视图
- 26. Backbone.js - 访问父级“集合”视图内的所有子视图
- 27. 遍历Android视图的所有子视图?
- 28. 获取视图不绑定所有子元素
- 29. 获取父视图的视图实例
- 30. 获取视图/视图组的索引
欢迎的StackOverflow!为什么不把用户名从user635064更改为更独特的东西?此外,如果您标记正确答案,您将更有可能获得帮助。 – Moshe 2011-03-27 03:08:00
同意关于用户名,但不知道为什么你告诉我关于标记问题是否正确?我总是标记一个正确的问题,如果它帮助我... – user635064 2011-03-27 03:29:52
@用户彼得是正确的。 – Moshe 2011-03-27 04:42:50