私はiOSプログラミングにかなり慣れていません..
現時点では、次の問題について疑問に思っています。関数 didFinishLaunchingWithOptions:(...) 内の AppDelegate.m で、次のようにビジュアル ツリーを下ってみました (注: mainstoryboard には TabBarController があり、最初のビューには 1 つのボタンがあります。
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] ビューの境界: (null): 2012-04-16 20:32:48.363 ViewsAnimationTouchDrawing[59046:f803]ビュー フレーム: (null) :
私に説明してくれるのはとてもいいかもしれません、なぜですか?(ウィンドウは既に初期化されており、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];
ウィンドウへの参照を取得しますが、ウィンドウのサブビューには要素がありません(初期化する必要があると思いましたが)。
ええ、私はそれについて疑問に思っているだけだと思います.. Apple は何らかの方法でストーリーボード内のビュー階層を分割しましたか?