2011-02-02 17 views
5

私は以前見たことのないものに出くわしました。原因を確認するためにここで尋ねると思いました。私はUIControllerの誰がプログラムで定義されているビューを持っていますが、私はloadViewとviewDidLoadの両方が両方とも4回呼び出されたというコードをloadViewからコメントアウトしたときに気付きました。私は、ビューのプロパティを設定していないため、iOSがviewをロードするために複数回試行していますが、viewDidLoadも呼び出された場合にはまだ少し不思議です。viewプロパティが設定されていないと、loadViewが複数回呼び出されましたか?

- (void)loadView { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 

    // MAP VIEW 
    // MKMapView *tempMapView = [[MKMapView alloc] init]; 
    // [tempMapView setDelegate:self]; 
    // [self setView:tempMapView]; 
    // [self setCustomMapView:tempMapView]; 
    // [tempMapView release]; 
} 

コンソール出力:

2011-02-02 14:10:00.194 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.209 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.212 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.226 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.229 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.243 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.246 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.259 Xrails[19501:307] -[MapController viewDidLoad] 
+0

は、私はまた、それらが実際に同じMapController – nduplessis

答えて

1

コメント。まず、ビューの呼び出し元が何も返されていないので、View Controllerのビューを再度要求するという前提が正しいと思います。これにより、documentation for UIViewController-viewとして記載されているように、-loadViewを通過します。

-viewDidLoadが後で呼び出されている理由は、ビューをロードしていないにもかかわらずです。私は、-loadViewが呼び出されている場所は、ビューがロードされたと仮定して、それ以降は-viewDidLoadを呼び出すと想像します。

いずれにしても、自分で-loadViewを実装する場合は、有効なビューが最後に表示されている必要があります。

2

私は2つの点がここにあると思うのviewDidLoadに、あなたのコードを入れて、loadViewメソッド

+0

から来ていることを確認することloadViewメソッドで自己のログを記録したいですコードのコメントを外すとうまくいきますが、何が起こっているのか不思議でした。 * .xibを使用していないので、loadViewはビューアイテムを作成するのに適しているようです。 – fuzzygoat

+0

ビューが現在ロードされていない場合、self.viewプロパティアクセサが-loadViewを呼び出します。無限の再帰が発生する可能性があります。 – iHS

9

追加[スーパーloadViewメソッド] loadViewメソッドの先頭で

+0

ありがとうございます。私がナビゲーションコントローラ経由でビューを出たとき、loadViewは8回、3回呼び出されていました。今それはすべて良いです。 – tazboy

+7

あなたは '[super loadView]'と呼ぶべきではないドキュメントに従ってください – user102008

+0

ドキュメントはloadViewを直接呼び出さないと言っています。それはsuper.loadViewを呼び出さないと言っていませんでした。 – Boon

1

loadViewのオーバーライドはself.viewにビューを割り当てる必要があります。あなたは手動であなたのビューを作成するために、このメソッドをオーバーライドすることができhttps://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

でドキュメント毎の

- (void)loadView 
{ 
    self.view = [UIView new]; 
} 

。これを行う場合は、 ビュー プロパティにビュー階層のルートビューを割り当てます。作成するビューは一意のインスタンスである必要があります。他のView Controllerオブジェクトと共有することはできません。このメソッドのカスタム実装では、superを呼び出すべきではありません。

おそらくこのような何かが呼び出されるのUIKitの深いダウン、いくつかの場所があります。

if (viewController.view == nil) { 
    [viewController loadView]; 
} 
関連する問題