를 얻을 나는 다음과 같은 UIView의 구조를 가지고 목표 C에서컨테이너 클래스 이름 (UIView의 유형)
UIView A contains UIView B
UIView B contains UIView C
UIView C contains UIView D
, 그것은이 가능합니다의 인스턴스 메서드에 액세스 할 수있는 UIView D에서 UIView의 클래스 인스턴스 A를 얻을 수를 D에서?
를 얻을 나는 다음과 같은 UIView의 구조를 가지고 목표 C에서컨테이너 클래스 이름 (UIView의 유형)
UIView A contains UIView B
UIView B contains UIView C
UIView C contains UIView D
, 그것은이 가능합니다의 인스턴스 메서드에 액세스 할 수있는 UIView D에서 UIView의 클래스 인스턴스 A를 얻을 수를 D에서?
나는 다음과 같은 코드를 작성하여 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];
}
}
}
이 귀하의 상황이 모든 상황에있을 것이라는 점을 확실히 알고 있다면, 당신은보기 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을 참조하십시오.
오! 고마워. :-) 태그를 설정하지 않고 이미 방법을 찾았습니다. 그러나 당신의 대답은 정확합니다. – sumon
:
UIView *refView = [[[D superView] superView] superView];
지금
if([refView isEqualTo:refView]){
NSLog(@"I am A");
}
을 확인하십시오은/superviews 서로 또는 서브 뷰의 그 서브 클래스/슈퍼 클래스입니까? – guenis
그 사람이 superviews입니다 – sumon
@ sanver, 당신은 질문을 이해하지 못해! – sumon