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ですか?

実際のコードでは、機能をSomeViewからself.view...に継承するという魔法を行っているようです。

参考:元のソースコード.

4

4 に答える 4

1

なのでself.viewUIViewあなたはそれをあなたにキャストする必要がありますSomeView

それで、

SomeView *someView = self.view;あなたに警告を与えるのであなたはそれをキャストします

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

魔法ではなく、UIViewtoをキャストするだけでSomeView、次のようにself.view定義されます。ただし、クラスUIView のインスタンスであるため、関数を使用するには、キャストする必要があります。SomeViewSomeView

于 2012-06-27T06:48:11.233 に答える
1

これは実際には、の機能にアクセスするためself.viewの型キャストです。SomeViewSomeView

ビューコントローラはすでにロードされていますSomeViewself.view、のインスタンスを返すUIViewため、警告を回避するためにこれを型キャストする必要があります。

于 2012-06-27T06:49:13.567 に答える
1

まず第一に、あなたの質問は元のソースの文脈からは当てはまりません。

コントローラーのビューは、ストーリーボードで IB によって明示的に設定されます。これはself.view、カスタムSomeViewクラスに設定されていることを意味しますが、コンパイラはそれを認識していません! キャストされているのはそのためです。

したがって、コンパイラには単純な a のように見えますUIViewが、実際にはSomeViewそのメソッドへのアクセスが必要な a です (したがって、コンパイラに「これが SomeView であることを心配しないで、このように処理してください」と伝えます)。これが理にかなっていることを願っています。

PS。答えはストーリーボードにあるため、実際に何が起こっているかを確認するには、実際のプロジェクトをダウンロードする必要があります

于 2012-06-27T07:58:36.757 に答える
0
[(SomeView *)self.view setPage:1];

つまり、self.viewはSomeveViewのタイプです

SomeView *someVw = [[SomeView alloc]init];
self.view = someVw;
于 2012-06-27T06:49:55.937 に答える