2012-04-16 2 views
0

Я новичок в программировании iOs ..Загрузка последовательности раскадровки

На данный момент я задаюсь вопросом о следующей проблеме. в AppDelegate.m внутри функции didFinishLaunchingWithOptions: (...) я пытался идти вниз визуальное дерево как (. Примечание: mainstoryboard имеет TabBarController и на начальном View есть одна кнопка

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] Просмотров: Bounds (неопределенные): 2012-04-16 20: 32: 48,363 ViewsAnimationTouchDrawing [59046: F803] Просмотров подрамник: (нуль):

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

** Обновление

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

ответ

0

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

UITabBarController имеет свойство viewControllers, которое представляет собой 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

Смежные вопросы