关于Objective-C代表,需要澄清

时间:2012-06-17 18:10:32

标签: objective-c delegates

如果我的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

3 个答案:

答案 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上的强制转换告诉编译器你知道将在那里存储什么。