0

如果我的UIView( MyUIView) 声明和@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

因为仅仅通过检查view属性是 aMyUIView并不会自动将其转换为一个。

你想要这样的东西:

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 回答