Bezdepbonusu7Программирование: статьи и ответы

Вопрос

UISplitViewController - всплывающий мастер при извлечении детали (и наоборот)

Автор вопроса: GuilhermeОтветов: 2

У меня есть этот UISplitViewController, в котором как основной, так и подробный VC являются UINavigationController подклассами. Оба должны работать "синхронно", т. е. когда один выдвигает новый VC, второй тоже должен проталкивать его. Когда один лопнет, другой тоже должен лопнуть. Один всегда вызывает одно и то же действие для другого.

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

Поппинг, с другой стороны, был большой проблемой. Действие запускается, когда пользователь нажимает кнопку "Назад", и я не знаю, как обнаружить это событие. Одним из возможных решений является обнаружение события.

Еще одно решение, о котором я подумал, состояло в том, чтобы переопределить UINavigationController - popViewControllerAnimated:, заставив один класс выталкивать другой класс, вот так:

// On DetailNav
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
  // Code to make MasterNav pop

  return [super popViewControllerAnimated:animated];
}

// On MasterNav
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
  // Code to make DetailNav pop

  return [super popViewControllerAnimated:animated];
}

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

Каков наилучший способ добиться желаемого поведения?

iosuinavigationcontrolleruisplitviewcontroller

Ответы

Ответ 1 · memmons

Для iOS 5+ - (BOOL)isMovingFromParentViewController помогает:

// Use this in the detail VC
- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];

  if (self.isMovingFromParentViewController) {
    // the view is being popped.
    // so also pop the master VC
  }
}

Ответ 2 · Guilherme

Я нашел решение в @Chrizzz answer на другой вопрос.

В основном вам нужны два подкласса UINavigationController, один для мастера и один для деталей.

В обоих подклассах вы должны включить UINavigationBarDelegate и установить для делегата значение self . Затем включите следующий метод:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
  [[[[self splitViewController] viewControllers][0 or 1] navigationController] performSelector:@selector(popViewControllerAnimated:) withObject:@YES afterDelay:0];
  return YES;
}

В мастере вы хотите извлечь детальный виртуальный канал, поэтому поставьте 1 в индексе.
В детали вам нужно будет извлечь основной виртуальный капитал, поэтому поставьте 0 в индексе.

Это решение позволяет вам запускать подпрограмму перед открытием контроллера представления.

Обновление
Некоторые ошибки панели навигации повреждались, например nested pop animation can result in corrupted navigation bar. Поэтому вместо прямого вызова popViewControllerAnimated: я вызвал performSelector: с нулевой задержкой, и теперь ничего плохого не происходит, когда я открываю свои представления.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы