2012-04-16 8 views
0

私はプログラミングにかなり新しいです。ストーリーボードの読み込み順序

現時点で私は次の問題について不思議です。関数didFinishLaunchingWithOptions内AppDelegate.mで :(...)私は のようなビジュアルツリーを歩くしようとしたが(注:mainstoryboardはTabBarControllerを持っており、最初のビューの上に一つのボタンがあり

UIView *sv; 
sv=[window subviews]; 
for(sv in mwSubViews){ 
NSLog(@"Subview's %d Description : %@ \n",i++,[sv description]); 
NSLog(@"Views Bounds: %@ :\n",sv.bounds); 
NSLog(@"Views Frame: %@ :\n",sv.frame); 

。 }

私はストーリーボードから要素を制御するのViewController内これを行うと、その出力は

ViewsAnimationTouchDrawing [59046:F803] ..ですその上にいくつかのものを持つ単一のストーリーボードを使用していサブビューの0説明: > 2012-04-16 20:32 :48.362 ViewsAnimationTouchDrawing [59046:F803]回数境界:(ヌル): 2012-04-16 20:32:48.363 ViewsAnimationTouchDrawing [59046:F803]ビューフレーム(ヌル):

月s.o.私を説明するのがいいのですが、なぜですか? (私は窓がすでに初期化され、その上にUIViewのを持っていると思った...)

**更新

私は現在のウィンドウビュー階層についての本を読んでいます。 作者は、通常、UIWindowクラスのインスタンスが1つ存在すると言います。 UIApplicationのデリゲートは、その参照を保持しています。私はアプリケーション内で.xibファイルを少し演奏しました。私は手動でウィンドウの参照にデリゲート以内にそれを割り当て、XIBファイルからウインドウをロードする場合、私は

UIWindow *mw = [[UIApplication sharedApplication] keyWindow]; 

でウィンドウへの参照を取得することができ、私は機能

-(void) runDownSubViewsWithCavemanDebug : (UIView*) view{ 
    NSArray *mwSubViews = [view subviews]; 
    static int i=0; 
    if([mwSubViews count]==0) return; 
    UIView *sv; 
    for(sv in mwSubViews){ 
    NSLog(@"Subview's %d Description : %@ \n",i++,[sv description]); 
    NSLog(@"Views Bounds: %@ :\n",sv.bounds); 
    NSLog(@"Views Frame: %@ :\n",sv.frame); 
    [self runDownSubViewsWithCavemanDebug:sv]; 
    } 
} 
でビジュアルツリーを歩くことができます

私はしかし、ストーリーボードを使用している場合(didFinishLaunchingWithOptionsで関数の呼び出し)

MainViewController *myMainVC = [[MainViewController alloc] init]; 
    NSArray *bundleResources = [[NSBundle mainBundle]loadNibNamed:@"View" owner:myMainVC   options:nil]; 
    UIWindow *mainWindow = [bundleResources objectAtIndex:0]; 
    self.window = mainWindow; 
    self.window.rootViewController = myMainVC; 

、私は.. keyWindowでウィンドウの参照を取得することはできません。 私は、ウィンドウへの参照を取得しますが、ウィンドウは(私はそれが初期化されてきたべきであると考えられている)そのサブビューで要素がない

UIWindow *realmw = [[[UIApplication sharedApplication]delegate] window]; 

でそれを得ることができます。

ええと、私はちょうどそれについて疑問に思います。アップルはストーリーボード内のビュー階層を何らかの形で分割しましたか?

答えて

0

あなたのAppDelegateは、順番にストーリーボードで定義されたルートビューコントローラを(あなたのケースで、それはUITabBarControllerである)を表すrootViewControllerという名前のプロパティを持っていることを、window(タイプUIWindow)という名前のプロパティを持っています。

UITabBarControllerには、tabbarコントローラが管理するすべてのviewControllerのNSArrayであるプロパティviewControllersがあります。

タブバーの最初のビューコントローラー(つまり、タブビューア)の各サブビューの詳細を確認したい場合は、最初のタブで)didFinishLoadingWithOptionsで次のようにこれを行うことができます:

UITabBarController *tabBarController = (UITabBarController*)self.window.rootViewController; 
NSArray *viewControllers = [tabBarController viewControllers]; 
UIViewController *firstVC = (UIViewController*)[viewControllers objectAtIndex:0] 
NSArray *subviews = [firstVC.view subviews] 

for (UIView *sv in subviews) { 
    NSLog(@"Subview's %d Description : %@ \n", i++, [sv description]); 
    NSLog(@"Views Bounds: %@ :\n", sv.bounds); 
    NSLog(@"Views Frame: %@ :\n", sv.frame); 
} 
+0

これは正しいです。明確にするために私の答えを少し調整しました。 – jonkroll

+0

あなたの投稿をありがとう。私はそれから学び、私は私の混乱を明確にするために私のポストを更新しました – Schemiii

関連する問題