我有以下UIView结构:
UIView A contains UIView B
UIView B contains UIView C
UIView C contains UIView D
在Objective C中,是否可以从UIView D获取UIView类实例A以从D访问A的实例方法?
答案 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");
}