2013-05-15 6 views
-3

를 얻을 나는 다음과 같은 UIView의 구조를 가지고 목표 C에서컨테이너 클래스 이름 (UIView의 유형)

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

, 그것은이 가능합니다의 인스턴스 메서드에 액세스 할 수있는 UIView D에서 UIView의 클래스 인스턴스 A를 얻을 수를 D에서?

+0

을 확인하십시오은/superviews 서로 또는 서브 뷰의 그 서브 클래스/슈퍼 클래스입니까? – guenis

+0

그 사람이 superviews입니다 – sumon

+0

@ sanver, 당신은 질문을 이해하지 못해! – sumon

답변

0

나는 다음과 같은 코드를 작성하여 A에서 D의 인스턴스 메소드에 액세스합니다. 실제로이 다음에 나는 D 객체의 인스턴스를 얻었습니다. 그리고 여기 A는 D 객체의 수퍼 뷰입니다.

-(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

이 귀하의 상황이 모든 상황에있을 것이라는 점을 확실히 알고 있다면, 당신은보기 D에서 다음을 수행 할 수

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

당신이보기 A는 최대 어딘가에 더 높다는 것을 알고있는 경우를 뷰 계층 구조이지만, 찾을 때까지 슈퍼 뷰를 반복 할 수있는 위치를 정확히 알지 못합니다. 당신은 단지 뷰를 식별 할 무언가가 필요합니다. 예 : 당신이 수에보기 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을 참조하십시오.

+0

오! 고마워. :-) 태그를 설정하지 않고 이미 방법을 찾았습니다. 그러나 당신의 대답은 정확합니다. – sumon

0

:

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

지금

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