Итерация «активных» контроллеров представления - PullRequest
0 голосов
/ 11 апреля 2010

Ола Фолкс,

В приложении для iPhone я отображаю различные виды с помощью метода addSubView: SomeViewController.view.

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

Я знаю, как перебирать представления, я просто не вижу, как получить доступ к контроллерам представлений этих представлений. Я ищу что-то, что даст мне тип доступа к контроллерам представления, который делает UINavigationController :: ViewControllers.

Я думал, что смогу сойти с рук:

for (UIViewController* oVC in [self.view subviews])

но это не дает ожидаемого эффекта.

Если у кого-то есть способ сделать это, пожалуйста, поделитесь им со мной.

-isdi-

Ответы [ 2 ]

1 голос
/ 11 апреля 2010

Представление не сохраняет ссылку на свой контроллер представления (или вообще ничего не знает о контроллерах представления), поэтому вам придется отслеживать это отображение самостоятельно. Если вы храните все свои контроллеры представления в массиве viewControllers, вы можете сделать что-то вроде:

- (UIViewController *) viewControllerForView:(UIView *)view {
    for (UIViewController *viewController in viewControllers)
        if (viewController.view == view)
            return viewController;
    return nil;
}
0 голосов
/ 11 апреля 2010

Стандартный способ взаимодействия представления с контроллером представления, которому он принадлежит, - установка контроллера представления в качестве цели делегата или действия представления. Представление предназначено для того, чтобы не иметь никаких сведений о делегате или цели действия.

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

Если вы рассматриваете представления как стек и хотите поддерживать стек контроллеров представления вдоль него, подобно тому, как UINavigationController делает для вас, вы должны сделать это вручную. Соедините каждый вызов addSubview: viewController.view с вызовом [myViewControllerArray addObject: viewController] и удалите viewController из массива при удалении представления из иерархии представлений.

...