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

У меня есть этот 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 в их корни (и затем, возможно, сбой).

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


person Guilherme    schedule 13.01.2014    source источник


Ответы (2)


Для 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 
  }
}
person memmons    schedule 13.01.2014
comment
Не застрянет ли он в петле, как раньше? Потому что, если я выскочу из Master, контроллер Detail введет этот оператор if в ваш код, верно? - person Guilherme; 14.01.2014

Я нашел решение в @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 в индексе.
В детали вам нужно будет извлечь основной виртуальный капитал, поэтому поставьте < b>0 в индексе.

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

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

person Guilherme    schedule 14.01.2014