9

ペン先からビューコントローラをロードし、そのサブビューの1つを舞台裏で使用することにしたと仮定します。後で、このViewControllerのビューを表示します。

viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[viewController.someSubview doSomething];

//later on 
[mainView addSubview:viewController.view];

問題は、ビューが表示されるまでsomeSubviewオブジェクトがロードされていないように見えるため、メソッドdoSomethingが呼び出されないことです。これまでのところ、私の回避策は次のように呼び出すことです。

[mainView addSubview:viewController.view];
[viewController.view removeFromSuperview];

最初にviewcontrollerのサブビューを初期化します。このタスクのためのより洗練された方法(loadSubviewsメソッドなど)はありますか?

4

2 に答える 2

23

まず、プロパティにアクセスしてみます。

[viewController view];

これにより、ビュー(したがって、サブビューやアウトレットなど)の遅延ロードが強制され、これで十分な場合があります。ビューコントローラは、デフォルトでは、アクセスするまでビューをロードしないため、遅延が発生している可能性があります。

このような負荷を強制することは、通常、アウトレットプロパティにアクセスしようとしているときに解決策ですが、実際には、実際にはまだバインドされていませんsomeSubview

ビューを追加して非表示にすることで、状況を少し改善することもできます。

viewController.view.hidden = YES;
[mainView addSubview:viewController.view];

addSubview次に、表示したいときに呼び出す代わりに、次のようにします。

viewController.view.hidden = NO;

UIViewAnimationTransitionFlipFromRightなどのトランジションを使用してビューでアニメーション化するときに、この方法を使用しました。ビューの遅延ロードを強制する場合でも、まだ顕著なラグがあるため、これを使用してパフォーマンスを少し向上させました。

于 2009-12-20T11:28:28.830 に答える
0

iOS9が導入されました-(void) loadViewIfNeeded

私が使う

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) {
    [_myVC loadViewIfNeeded];
} else {
    [_myVC view];
}
于 2016-03-11T02:40:24.507 に答える