Как выполнить итерацию всех UIViewControllers в приложении

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

У меня есть xib с такой структурой:

 - Tab Bar Controller
-- Tab Bar
-- NavigationController
--- Navigation Bar
--- News List View Controller
---- Navigation Item
--- Tab Bar Item

-- NavigationController
--- Navigation Bar
--- News List View Controller
---- Navigation Item
--- Tab Bar Item
-- NavigationController
--- Navigation Bar
--- News List View Controller
---- Navigation Item
--- Tab Bar Item
[...]
  

Как я могу закодировать цикл, чтобы использовать каждый UIViewController (контроллер просмотра списка новостей) на каждой итерации?

Ответ №1:

Получите к ним кодовый доступ следующим образом:

 NSArray * controllerArray = [[self navigationController] viewControllers];

for (UIViewController *controller in controllerArray){
   //Code here.. e.g. print their titles to see the array setup;
   NSLog(@"%@",controller.title);
}
  

Комментарии:

1. Спасибо. Наконец, я решаю эту проблему, создавая пользовательский массив NavigationControllers в файле делегата, возможно, это не лучший способ, но он работает.

Ответ №2:

Если вы используете iOS 5, вы можете сделать что-то вроде этого:

 - (void) processViewController: (UIViewController *) viewController {
    //do something with viewcontroller here
    NSLog(@"I'm viewcontroller %@", viewController);
    for ( UIViewController *childVC in viewController.childViewControllers ) {
        [self processViewController:childVC];
    }
}
  

и начать все самое интересное с:

 [self processViewController:myRootViewController]; //would be the tabbarcontroller in your case
  

Редактировать: я не уверен, чего вы хотите здесь добиться, но этот код предназначен для просмотра всего дерева.

Редактировать 2:

Для iOS 4 попробуйте что-то вроде этого:

 - (void) processViewController: (UIViewController *) viewController {
    //do something with viewcontroller here
    NSLog(@"I'm viewcontroller %@", viewController);

    if ( [viewController isKindOfClass:[UITabBarController class]] ) {
        for ( UIViewController *childVC in ((UITabBarController *)viewController).viewControllers ) {
            [self processViewController:childVC];
        }
    }
    else if ( [viewController isKindOfClass:[UINavigationController class]] ) {
        for ( UIViewController *childVC in ((UINavigationController *)viewController).viewControllers ) {
            [self processViewController:childVC];
        }
    }
}
  

Примечание: вам нужно будет добавить любой пользовательский viewcontroller, у которого есть subviewcontrollers. Если они у вас есть.. Корневой viewcontroller запускает его снова.

Комментарии:

1. Спасибо, но я не могу использовать iOS 5 в этом проекте :/

2. Спасибо за помощь. Наконец, я решаю это с помощью пользовательского массива панелей навигации, потому что я не могу использовать рекурсивный метод. Возможно, это не лучший способ, но он работает.

3. Он не обнаруживает контроллеры модального представления, добавленные presentViewController: анимированный: