Как правильно переключить контроллер дочернего представления контейнера, когда представлен модальный [дубликат]

Независимо от системы:

my_multiline_text.replace(/$/mg,'<br>');
5
задан Ian 4 August 2013 в 21:37
поделиться

2 ответа

  1. Когда вы используете addChildViewController, чтобы добавить ContentPortraitVC: a. ContentPortraitVC получает свой набор свойств parentViewController. б. После этого (согласно документации Apple) необходимо вручную отобразить представление ContentPortraitVC. Если вы следуете документации, вы делаете это, добавляя ее как дочерний элемент верхнего уровня ControllerVC.
  2. Затем ContentPortraitVC вызывает presentViewController для отображения ContentModalDetailVC. а. Это устанавливает его свойство presentingViewController (в отладчике это показано как _parentModalViewController ivar - примечание, что ivar отличается от свойства) и устанавливает свойство presentedModalViewController для ContentPortraitVC (у кого есть ivar _childModalViewcontroller ]). б. Взгляды мудрым, на iPhone, представление ContentModalDetailVC полностью заменит представления из ContentPortraitVC и ContainerVC, поэтому будет видно только вид диспетчера режима просмотра. (на iPad он накладывает новый пользовательский интерфейс поверх вершины, но как родной вид ControllerVC, который, в свою очередь, является родителем представления ContentPortraitVC.
  3. Итак, теперь , вы переходите от ContentPortraitVC к ContentLandscapeVC. а. IOS делает немного магии. Он знает, что вещь, которую вы удаляете (ContentPortraitVC) имеет активную presentedViewController, поэтому она меняет родителя. Он устанавливает значение nil на ContentPortraitVC, принимает дочерний элемент (ContentModalDetailVC) и устанавливает родительский элемент в новое представление (ContentLandscapeVC). Итак, теперь контроллер вида, который представил модальный вид , уже не является его представлением контроллера представления . Это как если бы ContentLandscapeVC представило его в первую очередь! б. Что касается взглядов, вы следуете документам Apple, чтобы изменить их с ContentPortraitVC на ContentLandscapeVC. Но вы просто меняете представления в представлении ControllerVC. На iPhone контроллер модального просмотра остается единственным, что отображается, поэтому изменение ничего не делает на экране. На iPad это происходит (хотя вы, вероятно, этого не увидите, поскольку модальное представление обычно полноэкранное).
  4. Теперь вы приходите, чтобы отклонить модальный вид. Предположительно, вы делаете это в ContentPortraitVC, но больше не ссылаетесь на то, что он представил. Поэтому вызов [self dismissViewController... ничего не делает, потому что ContentPortraitVC больше ничего не представляет, ответственность за это была передана ContentLandscapeVC.

Так вот что происходит и почему. Вот, что с этим делать.

  1. Вы можете перенастроить делегат вручную при изменении с ContentPortraitVC на ContentLandscapeVC, так что последний тот, который пытается отклонить модальный контроллер.
  2. Модальный контроллер можно отключить с помощью [self dismissModalControllerAnimated:YES completion:nil]. Я собираюсь спросить и ответить на другой вопрос о том, почему это работает (как IOS знает, что увольнять?), Если это кажется странным.
  3. У вас может быть ControllerVC тот, который всплывает модальный вид и нести ответственность за его удаление.
4
ответ дан 4 revs 22 August 2018 в 14:28
поделиться
  • 1
    Я столкнулся с этой проблемой и понял, что происходит из этого ответа, спасибо! Как насчет обработки случая представленных контроллеров представления в контроллере представления контейнера при переключении? То есть проверяя наличие presentedViewController на текущем контроллере дочерних представлений и вместо этого заменяя этот вид. Разве это нарушит дизайн? – kolizz 19 April 2015 в 18:38

Если вы проверите presentingViewController на ContentModalDetailVC, вы увидите, что он фактически представлен ContainerVC, а не ContentPortraitVC.

Чтобы исправить это, вам просто нужно установить definesPresentationContext (или установите флажок «Определяет контекст» в Interface Builder) на ContentPortraitVC.

Это позволит ContentPortraitVC обрабатывать модальную презентацию вместо того, чтобы передавать цепочку ответчиков на следующий контроллер представления, который определяет контекст представления (по умолчанию контроллер корневого представления).

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

Когда оба дочерних контроллера определяют свой собственный контекст представления, когда ContainerVC решает обменять детей, любой модальный модал будет удален из новой иерархии вместе с дочерним элементом, который его представил. Нет необходимости делать взломанные вещи, чтобы попытаться уволить их перед заменой:)

Изменить: Я должен добавить, что представленный диспетчер представлений должен иметь свой modalPresentationStyle Установить либо currentContext или overCurrentContext,

2
ответ дан RyanM 22 August 2018 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: