0

私のUIViewMyUIView)が宣言し、@synthesize(s)

@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
4

3 に答える 3

1

プロパティがaであることを確認するだけでは、viewプロパティがMyUIView自動的に1にキャストされないためです。

あなたはこのようなものが欲しいです:

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

チェックした後、コンパイラがそのプロパティMyUIView*を「見る」ことができるタイプの変数を作成する方法に注意してください。delegateそれはすべてタイプについてです:-)。

于 2012-06-17T18:15:55.940 に答える
1

viewプロパティはUIViewControllerとして宣言されてUIView *おりUIView、プロパティがないためdelegateです。コンパイラによるプロパティ(およびメソッド)ルックアップは、コンパイル時に行われるため、動的ではないことに注意してください。

使用する

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

代わりは。

于 2012-06-17T18:16:05.070 に答える
1

[self.view isKindOfClass:[MyUIView class]]は実行時チェックであり、実際に割り当てられているオブジェクトの種類を判別できますview。一方、コンパイラはその情報を持っておらず、それviewが何らかの種類であることを知っているだけなので、不平を言っていUIViewます。

キャストオンself.viewを使用して、そこに何が格納されるかがわかっていることをコンパイラーに通知します。

于 2012-06-17T18:16:59.297 に答える