#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: анимированный: