获取容器类名称(UIView类型)

时间:2013-05-15 13:53:56

标签: ios objective-c

我有以下UIView结构:

UIView A contains UIView B
UIView B contains UIView C
UIView C contains UIView D

在Objective C中,是否可以从UIView D获取UIView类实例A以从D访问A的实例方法?

3 个答案:

答案 0 :(得分:2)

如果您确定在所有情况下这都是您的情况,您可以从视图D执行以下操作:

[self.superview.superview.superview instanceMethod:anArgument]; // Ew.

如果您知道View A位于视图层次结构中较高的位置,但您不知道在找到它之前可以在哪里循环浏览超级视图。你只需要一些东西来识别视图。例如。你可以将View A的tag属性设置为一个数字(比方说42)并找到它:

UIView *sup = self.superview;
while (sup.tag != 42) {  
    sup = sup.superview; // Keep going up the hierarchy until you find a match.
}

[sup instanceMethod:anArgument];

注意:此代码非常不安全。只有当你确定它在层次结构中的某个地方时才使用。

另请参阅文档中的here

答案 1 :(得分:0)

我编写以下代码以从D访问A的实例方法。实际上,我从D获得了一个A对象的实例。这里A是D Object的超级视图。

-(void)getTheSpecificSuperView
{
    BOOL found = FALSE;
    UIView *currentSuperView = self; // right now it is D

    while (!found) {
        if ([[currentSuperView superview] isKindOfClass:[A class]]) {
            found = TRUE;
            A *a = (A *)[currentSuperView superview];
            [a accessAnInstanceMethod];
        }
        else{
            currentSuperView = [currentSuperView superview];
        }

    }
}

答案 2 :(得分:0)

是的:试试,

UIView *refView = [[[D superView] superView] superView];

现在检查

if([refView isEqualTo:refView]){
   NSLog(@"I am A");
}