2012-06-27 132 views
1

SomeView.h这种类型的含义是什么?

@interface SomeView : UIScrollView <UIScrollViewDelegate> 

- (void)setPage:(int)page; 

@end 

SomeViewController.h

@interface SomeViewController : UIViewController 

@end 

SomeViewController.m

#import "SomeView.h" 
#import "SomeViewController.h" 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [(SomeView *)self.view setPage:1]; 
} 

什么是(SomeView *)self.view意思?

在真正的代码,似乎在做继承功能的魔法从SomeViewself.view ...

参考:source code

回答

1

类型。

控制器的视图由IB在故事板中明确设置。这意味着self.view被设置为自定义SomeView类,但编译器不知道!这就是它被铸造的原因。

所以它看起来像编译器的普通UIView,但实际上是需要访问其方法的SomeView(所以我们告诉编译器'不要担心这是一个SomeView,继续并像这样对待' )。我希望这是有道理的。

PS。你必须下载实际的项目才能看到真实情况,因为答案可以在故事板中找到

1

因为self.viewUIView你需要将它投放到您的SomeView

所以,

SomeView *someView = self.view;会给你一个警告 所以,你投它

SomeView *someView = (SomeView *)self.view; 

它不是魔术,它只是将UIView转换为SomeView,self.view定义为UIView 但其SomeView类的一个实例,所以序使用SomeView功能,你需要转换其

+0

为什么“'self.view' ...是'SomeView'的一个实例? 'SomeViewController。m''只能导入SomeView.h'','self.view'''''只是'UIView'的一个实例。 – ohho

+0

由于Objective-C是动态类型的,尽管它被声明为UIView,但如果将其分配给分配的SomeView属性,它将会使SomeView的一个实例。这就是多态性是如何工作的。 – 2012-06-27 07:02:00

+0

@ H2CO3是否指''(SomeView *)'等于'[[SomeView alloc] init]'? – ohho

1

这实际上是从self.viewSomeView一个类型转换的SomeView访问功能。

由于您的视图控制器已经加载SomeView,但self.view将返回UIView一个实例,这就是为什么它是需要强制转换是为了避免警告。

0
[(SomeView *)self.view setPage:1]; 

,这意味着你的self.view是SomeveView

的所有问题并不适用了 源的上下文的首先
SomeView *someVw = [[SomeView alloc]init]; 
self.view = someVw; 
+0

是的,但它不调用alloc init。 – Simon