2012-06-17 98 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上使用强制转换告诉编译器,您知道将在那里存储什么。