Загрузка последовательности раскадровки

Я совсем новичок в программировании iOS..

На данный момент меня интересует следующая проблема. в AppDelegate.m в функции didFinishLaunchingWithOptions:(...) я пытался пройтись по визуальному дереву, например (Примечание: основная раскадровка имеет 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 Кадр просмотров: (нулевой) :

Мэй с.о. будьте так любезны, объясните мне, почему? (я думал, что окно уже инициализировано и на нем есть UIView..)

**Обновлять

В настоящее время я читаю книгу о Window View Hierarchy. Автор говорит, что обычно существует один экземпляр класса UIWindow. Делегат из 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 как-то разбила иерархию представлений в раскадровках?


person Schemiii    schedule 16.04.2012    source источник


Ответы (1)


Ваш AppDelegate имеет свойство с именем window (тип UIWindow), которое, в свою очередь, имеет свойство с именем rootViewController, представляющее корневой контроллер представления, определенный в раскадровке (в вашем случае это UITabBarController).

UITabBarController имеет свойство viewControllers, которое представляет собой 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);
}
person jonkroll    schedule 16.04.2012
comment
Это верно. Я немного скорректировал свой ответ, чтобы уточнить. - person jonkroll; 17.04.2012
comment
Спасибо за ваш пост. Я узнал об этом и обновил свой пост, чтобы прояснить свое замешательство. - person Schemiii; 17.04.2012