Objective-C - 获取主窗口contentView的所有子视图

时间:2011-08-26 19:08:02

标签: objective-c views

我想收集主窗口contentView的所有子视图的x / y坐标和w / h。在IB中我有一个视图对象vHUD。最终我将在IB中或以编程方式添加其他内容。我会将它们用于各种UI用途,可以滑入和滑出可视区域。所以我的想法是我可以编写一个toggle方法,收集awakeFromNib中的所有坐标数据,设置一些规则然后打开,例如,按钮点击,将视图传递给a方法,在字典中找到它的属性,(x ,y,h,w,切换规则)然后执行规则。

所以在awakeFromNib中我有:

- (void) awakeFromNib { 

     [self getViewData: [mainWin contentView]];
     NSLog(@"%@", subviews);
}

并在getViewData中:

- (void ) getViewData : (NSView* ) v { 

     subviews = [[v subviews] mutableCopy];


}

但是这似乎没有用,因为它返回null到我的日志。知道如何做到这一点?

2 个答案:

答案 0 :(得分:1)

UIView不符合NSMutableCopying协议,实际上甚至不符合NSCopying。因此,任何致电copymutableCopy的尝试都将失败。

在你的情况下,我不会复制,甚至尝试。与什么是一起工作。快速完成并在主线程上执行,您可以确保层次结构对于计算是稳定的。

答案 1 :(得分:1)

通过执行以下操作,确定无法理解您的主要窗口子视图的问题:

[[mainWin contentView] subviews]

现在,如果你想 COPY 这些子视图有点棘手,因为PeyloW正确地提到,UIView没有响应NSMutableCopying协议。

因此,您可以编写一个UIView类别,并添加一个名为- (UIView*) forceCopy的方法,该方法将递归地创建新的UIViews并递归地传递其子项:

@implementation UIView (YourCategory)

- (UIView*) forceCopy
{
    if (self == nil)
        return nil;

    UIView* aNewView = [[[self class] alloc] initWithFrame:self.frame];

    [aNewView setBackgroundColor:[self backgroundColor]];
    [aNewView setCenter:[self center]];
    [aNewView setContentMode:[self contentMode]];
    [aNewView setHidden:[self isHidden]];
    [aNewView setAlpha:[self alpha]];
    [aNewView setOpaque:[self isOpaque]];
    [aNewView setTag:[self tag]];

    for (UIView* aChildenView in [self subviews])
    {

        UIView* aPotentialNewView = [aChildenView forceCopy];
        if (aPotentialNewView)
            [aNewView addSubview:aPotentialNewView];
    }
    return aNewView;
}

@end

但是要小心你需要创建尽可能多的类别,因为主窗口中有不同类型的视图(UIButton,UILabel ...),并相应地添加它们的属性,例如在{{ 1}}

UILabel