Отключение контроллера всплывающего окна с разделенным представлением

У меня есть UISplitViewController с основным представлением, настроенным следующим образом:

UITabBarController
  Tab1:
    UINavigationController -> UIViewController -> UIViewController
  Tab2:
    UINavigationController -> UIViewController

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

Контроллер панели вкладок является UISplitViewControllerDelegate и обрабатывает кнопку на панели инструментов в верхней части представления прокрутки.

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

Я не вижу, чтобы другие люди задавали этот вопрос, что наводит меня на мысль, что я снова упустил из виду что-то простое. Пожалуйста, просветите меня!


person janineanne    schedule 13.06.2012    source источник


Ответы (2)


Похоже, ваш контроллер панели вкладок уже является подклассом UITabBarController, а это значит, что у вас уже есть некоторый собственный код. Я бы предположил, что контроллер панели вкладок является основным владельцем всплывающего окна, и ответственностью контроллера табличного представления является простое уведомление контроллера панели вкладок о сделанном выборе. Контроллер панели вкладок может ответить на это сообщение, закрыв всплывающее окно. Вы можете воспользоваться тем фактом, что UIViewController уже имеет метод доступа к контроллеру панели вкладок, который содержит данный контроллер.

Таким образом, это будет выглядеть примерно так:

@interface MyTabBarController : UITabBarController
- (void)itemWasSelected;
@end

@implementation MyTabBarController {
  UIPopoverController *popover;
}

- (void)itemWasSelected {
  [popover dismissPopoverControllerAnimated:YES];
}
@end

//////////////

@implementation TableController

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)path {
  // Do whatever else you want to do
  MyTabBarController *tabController = (MyTabBarController *)self.tabBarController;
  [tabController itemWasSelected];
}

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

person BJ Homer    schedule 23.06.2012

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

person crackity_jones    schedule 18.06.2012