2012-06-27 137 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