2012-06-17 138 views
0

如果我UIViewMyUIView)聲明並@synthesize(S)在Objective-C的代表,澄清需要

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

MyController被聲明爲

@interface MyController : UIViewController <UIScrollViewDelegate> 

,並符合下列條件(內myController的)

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

爲什麼會出現以下問題?

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

同時,如果我手動創建MyView的實例,它的工作原理:

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

回答

1

由於UIViewControllerview屬性被聲明爲UIView *UIView沒有一個delegate財產。請注意,編譯器的屬性(和方法)查找是而不是動態的,因爲它是在編譯時完成的。

使用

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

代替。

1

因爲剛通過檢查view屬性是MyUIView不會自動將其轉換爲一個。

你想是這樣的:

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

注意如何檢查之後,我創建MyUIView*類型的變量,編譯器將然後能夠「看到」 delegate屬性就可以了。這都是關於類型:-)。

1

[self.view isKindOfClass:[MyUIView class]]是一個運行時檢查,並且可以確定實際上已將哪種對象分配給view。另一方面,編譯器抱怨,因爲它沒有這些信息,只知道view是某種UIView

self.view上使用強制轉換告訴編譯器,您知道將在那裏存儲什麼。