Как избежать бесконечной петли Modal Storyboard
Год назад я написал несколько приложений для iOS на старой версии XCode. Я только начал новый проект и обнаружил функцию раскадровки в последнем Xcode. Оказывается, это идеально подходит для приложения, которое я пишу, поскольку оно состоит из ~30 взаимосвязанных экранов.
Мой вопрос заключается в том, как мне структурировать раскадровку и сегменты, чтобы приложение могло следовать по моему экрану по кругу. Я видел несколько примеров, которые просто переключают экран 1 на экран 2, а затем экран 2 на экран 1, используя модальную опцию. Это явно работает, но когда я отлаживаю приложение, построенное таким образом, оно создает новый экземпляр каждого экрана (контроллера представления) для каждого выполненного перехода. На диаграмме ниже (извините, я нарисовал красивую картинку, но из-за своего статуса новичка не смог ее опубликовать), как мне перейти с экрана 1 на экран 2 на экран 3 и обратно на исходный экран 1 без создания нового пример?
// Screen 1 --> Screen 2 --> Screen3
// ^ |
// | |
// +-------------------------+
2 ответа
Хорошо, с момента постановки этого вопроса я провел немало исследований и считаю, что могу дать разумный ответ на этот вопрос. Короче говоря, подход, который я предложил в этом вопросе, не совместим с тем, как на самом деле работают раскадровки и сегменты. Segues всегда создает новый экземпляр контроллера / представления представления, на который он нацелен. Это означает, что когда мы возвращаемся с экрана 3 на экран 1, мы идем к новому экземпляру экрана 1, а не к оригиналу. Чтобы решить эту проблему, я реализую раскадровку немного по-другому.
// Screen 1 --> Screen 2
// |
// +------> Screen 3
Затем я настрою Экран 1 для прослушивания сообщения "следующий экран" (через делегата / протокол) с экранов 2 и 3.
Когда пользователь на экране 1 выбирает кнопку для экрана 2, раскадровка и переход будут обрабатывать модальное создание экрана 2. Когда пользователь на экране 2 выбирает кнопку "Следующий экран" вместо перехода к экрану 3, я отклоняю экран 2 и экран 1 запускает экран 3 через новый экран 1 -> экран 3.
Этот подход имеет то преимущество, что позволяет экрану 1 быть главным контроллером для всех последующих экранов в цикле (в моем случае у меня есть 10 экранов / упражнений в цикле). Единственным недостатком является то, что раскадровка не очень хорошо отражает поток экранов.
Я надеюсь, что это поможет другим, пытающимся достичь того же в своих проектах iOS.
Я нашел хорошее решение этой ситуации - создать новый пользовательский сценарий для отклонения контроллера представления источника. Как это сделать? Чтобы создать это, вы можете увидеть ссылку http://jeffreysambells.com/2014/02/19/dismissing-a-modal-view-using-a-storyboard-segue Я надеюсь, что это поможет другим =)