2012-06-17 3 views
0

@synthesize 필요 (들)이 설명은 <code>UIView</code> (<code>MyUIView</code>가) 선언 내 경우에는

@property (nonatomic, weak) id<UIScrollViewDelegate> delegate; 

MyController

@interface MyController : UIViewController <UIScrollViewDelegate> 

로 선언하고 다음 (MyController에 내부 사실이다)

if ([self.view isKindOfClass:[MyUIView class]]){ 
    NSLog(@"yes");   // We see this 
} 

왜 다음과 같은 문제가 있습니까? 내가 수동으로 MYVIEW의 인스턴스를 만드는 경우

self.view.delegate = self; // Does not see "delegate" 

한편, 그것을 작동 :

MyView *c = [MyView new];  
c.delegate = self;   // works fine 

답변

1
UIViewControllerview 속성 UIView *로 선언되어 있기 때문에

UIViewdelegate 속성이 없습니다. 컴파일시 속성 (및 메서드) 조회가 이 아니고 동적 인 것은 컴파일 타임에 완료된 것입니다.

사용

((MyUIView *)(self.view)).delegate = self; 

대신.

1

을하기 때문에 단지 view 속성이 자동으로 하나에 캐스팅하지 않는 MyUIView 것을 확인하여. 확인 후, 나는 컴파일러는 다음에 delegate 속성을 "볼"수있을 것 유형 MyUIView*의 변수를 만드는 방법

if ([self.view isKindOfClass:[MyUIView class]]) { 
    MyUIView *myView = (MyUIView*)self.view; 
    myView.delegate = self; 
} 

주의 사항 :

당신이 뭔가를 할 수 있습니다. 모든 유형에 대한 :-).

1

[self.view isKindOfClass:[MyUIView class]]은 런타임 검사로 실제로 어떤 종류의 객체가 view에 할당되었는지 확인할 수 있습니다. 반면에 컴파일러는 해당 정보가없고 일종의 view 일 뿐이므로 불만을 표시합니다.

self.view의 캐스트를 사용하여 컴파일러에게 무엇이 저장 될지 알 수 있음을 알립니다.

관련 문제