如果我的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
答案 0 :(得分:1)
因为只检查view
属性是MyUIView
是不是自动将其转换为一个。
你想要这样的东西:
if ([self.view isKindOfClass:[MyUIView class]]) {
MyUIView *myView = (MyUIView*)self.view;
myView.delegate = self;
}
注意在检查之后,我创建了一个MyUIView*
类型的变量,然后编译器就可以“看到”它上面的delegate
属性。这些都与类型有关: - )。
答案 1 :(得分:1)
由于view
的{{1}}属性声明为UIViewController
,而UIView *
没有UIView
属性。请注意,编译器的属性(和方法)查找不是动态的,因为它是在编译时完成的。
使用
delegate
代替。
答案 2 :(得分:1)
[self.view isKindOfClass:[MyUIView class]]
是运行时检查,可以确定实际分配给view
的对象类型。另一方面,编译器抱怨,因为它没有那些信息,只知道view
是某种UIView
。
使用self.view
上的强制转换告诉编译器你知道将在那里存储什么。