2016-06-01 12 views
1

実験目的のために、私は完全にコードで何かを試しています。完全にプログラムで作成されたUIView/UIViewControllerの場合、loadViewとviewDidLoadの違いは何ですか?

RootViewとRootViewControllerと呼ばれるカスタムルートUIView/UIViewControllerのサブクラスがあります。

また、RenderViewとRenderViewControllerと呼ばれるGLKView/GLKViewControllerサブクラスのペアがあります。

UIViewControllerのサブクラスは、いずれもloadViewオーバーライドで管理されたビューを作成します。

メインRootViewController/RootViewの設定は簡単です。私AppDelegateのサブクラスでは、私は、メインウィンドウを作成し、そのようrootViewControllerのproeprtyを割り当てる...

#import "AppDelegate.h" 
#import "RootViewController.h" 

@implementation AppDelegate 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     CGRect screenBounds = [[UIScreen mainScreen] bounds]; 

    // Set up the window 
     UIWindow* mainWindow = [[UIWindow alloc] initWithFrame:screenBounds]; 
     mainWindow.rootViewController = [RootViewController new]; 
     self.window = mainWindow; 

     [mainWindow makeKeyAndVisible]; 

     return YES; 
    } 

@end 

RootViewは1つが期待するとおりに画面に表示されます。

私はしかし、ビュー階層の初期化については不思議だ。 RootViewControllerにはRenderViewControllerのインスタンスを保持するプロパティがあり、そのRenderViewはrenderViewFrameというRootViewControllerの2番目のプロパティに格納されているフレームに(最初に)配置されます。

私の質問は、その階層を設定するための適切な場所はどこですか?そう、これは...私がやっている

- (void)loadView 
{ 
    self.view = [[RootView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Set up the RenderViewController 
    RenderViewController* renderViewController = [RenderViewController new]; 
    [self addChildViewController:renderViewController]; 

    renderViewController.view.frame = self.renderViewFrame; 
    [self.view addSubview:renderViewController.view]; 

    self.renderViewController = renderViewController; 
} 

です...そして、それは動作しますが、私は何人かの人々が言うのを見てきましたためUIViewControllerloadViewが正確に何

ドキュメントの状態いいえ、RenderView/RenderViewControllerの作成に関するすべてをRootViewControllerのviewDidLoadに移動し、loadViewではなく移動する必要がありますが、誰もその理由を言うことはできません。私はそれが階層の一部であり、具体的にはloadViewが対象であることを意味します。

loadViewで既に初期化を行っている場合は、私は誰でも/誰でもviewDidLoadを使用する必要がありますか、またはメモリがビューをすべてアンロードするときのアーティファクトだけですiOS6では?

答えて

0

あなたの解決策は、完全にプログラム的な解決策です。 loadViewを実装する必要があるので、ここですべての初期化を行うこともできます。

あなた(のみviewDidLoadで残りを行い、loadViewviewプロパティを設定する)混合loadViewviewDidLoadソリューションを行うことができます。後でNIB /ストーリーボードのソリューションに行くのが簡単になるかもしれません。 1つの場所に初期化するだけでは(loadView)、2つに分割するよりも保守が簡単です(loadViewおよびviewDidLoad)。一方、ほとんどの人はviewDidLoadメソッドを見ると予想されます。あなたが見ることができるように、それは主に味の問題です。

XIBやストーリーボードを使用する場合は、もちろんloadViewに触れないようにしてください。viewDidLoadしか実装しないでください。

+0

それに基づいて、私は後にIBoutletを例にしてより明確にすることができると思います。 RenderViewControllerプロパティの私の設定は、IBがアウトレットで何をしているのと同じです。では、IBはこれらのアウトレットをどこで設定しますか?loadView、viewDidLoad、またはその2つの間? – MarqueIV

+0

ほとんどの場合、 'loadView'にはIIRCがありますが、それ以降にいくつかのことが行われていますが、今は何が覚えていないのでしょうか(おそらく私は' awakeFromNib'を考えています) – Wain

+0

本当は、 。私はワインとほぼ同じコメントを書くつもりだった。 – DarkDust

0

リンゴのドキュメントでは、実際にはloadViewにビューをロードし、他に何もしないようにと言い、その後、

あなたの意見の追加の初期化を実行したい場合は、viewDidLoadメソッドで行います。

技術的には両方のアプローチが機能しますが、それは懸念を分離し、最も理にかなっており、見つかると予想されるロジックを置くことです。

方法がloadViewHierarchyの場合は、ブーツを記入してください。すべてのアプリの99.9999 ...%では、追加のビューが(NIBまたはで)viewDidLoadに追加されます。

+0

@ DarkDustの答えに自分のコメントを見てください。 – MarqueIV

関連する問題