0

我对 iOs 编程很陌生..

目前我想知道以下问题。在函数 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] Subview's 0 Description : > 2012-04-16 20:32:48.362 ViewsAnimationTouchDrawing[59046:f803] Views Bounds: (null) : 2012-04-16 20:32:48.363 ViewsAnimationTouchDrawing[59046:f80TouchDrawing]视图框架:(空):

可以这么好解释我,为什么?(我认为窗口已经初始化并且上面有一个 UIView ..)

**更新

我目前正在阅读一本关于 Window View Hierarchy 的书。作者说通常有一个 UIWindow 类的实例。UIApplication 的委托持有对它的引用。我在我的应用程序中使用了一些 .xib 文件。如果我从 xib 文件手动加载窗口,在委托中将其分配给窗口引用,我可以使用以下命令获取对窗口的引用

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

我可以使用 Function 沿着可视化树向下走

-(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)。

UITabBarController 有一个属性viewControllers,它是标签栏控制器管理的所有 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 回答