0

私は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 は何らかの方法でストーリーボード内のビュー階層を分割しましたか?

4

1 に答える 1

0

AppDelegate にはwindow(タイプ UIWindow) という名前のプロパティがあり、rootViewControllerこれには、ストーリーボードで定義されたルート ビュー コントローラーを表すという名前のプロパティがあります (この場合は UITabBarController です)。

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

タブバーの最初のビュー コントローラー (つまり、最初のタブ) の各サブビューの詳細を確認したい場合は、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);
}
于 2012-04-16T19:04:36.347 に答える