Подтвердить что ты не робот

'Show' segue в Xcode 6 представляет viewcontroller как модальный в iOS 7

У меня есть два контроллера вида в приложении для iPhone (построено с быстрым), построенное с помощью Xcode 6.1 и использующее раскадровки.

Первый контроллер представления встроен в контроллер навигации в раскадровке, а сегмент для второго контроллера представления - это "Show" segue.

Когда приложение запущено, он правильно показывает переход как push в iOS 8.x, но в iOS 7.x он отображается как модальный без панели навигации.

Мое требование приложения заключается в том, чтобы показать переход как push независимо от того, является ли он iOS 7 или iOS 8. Любые идеи, чтобы заставить эту работу работать в обеих версиях iOS?

Я видел связанный пост, где упоминается эта проблема, но не смог найти решение проблемы: Адаптивный переход в раскадровке Xcode 6. Неужели устаревший push?

Любая помощь приветствуется...

Спасибо

4b9b3361

Ответ 1

Это решение отличается от других следующими способами:

  • Он включает в себя метод проверки и проверки проблемы.
  • Причина проблемы связана с исходным кодом (изменение типа segue)
  • Решение очень простое (удалить и воссоздать новый сеанс)
  • Обратите внимание на требования в тексте

Я только что дал очень подробный ответ SO, который полностью объясняет, что происходит и почему, но простое решение - вы можете удалить Segue, который не толкает, а затем воссоздайте его на раскадровке. Причина в том, что в segue, вероятно, есть разбитый бит xml (см. Расширенный ответ, например/инструкции, как подтвердить эту проблему).

После того, как вы подтвердите, что у вас есть хотя бы один UINavigationController в иерархии представлений, убедитесь, что segue НЕ является ручным segue и не имеет связанного с ним действия (просмотрев segue в раскадровке в качестве исходного кода). Удалите существующий segue, а затем Ctrl-перетащите из UIView/UIControl в контроллер целевого представления, и если требуется специальное действие, перехватите вызов на контроллер назначения в prepareForSegue.

Также, чтобы подтвердить, что это решение работает для вас, пожалуйста, сделайте следующее:

  • Убедитесь, что ваш начальный контроллер представления (со стрелкой на нем) является UINavigationController и что он имеет обычный просмотр содержимого контроллер в качестве контроллера корневого представления. (или что вы контроллер начального представления внутри UINavigationController)
  • Прочитайте мои расширенные комментарии относительно более раннего ответа на очень похожий вопрос (см. выше).

Ответ 2

Возможно, вы назначили контроллер начального представления на свой UIViewController вместо UINavigationController. Кроме того, выберите свой UIViewController и убедитесь, что опция "Исходный контроллер просмотра" не отмечена.

Set the UINavigationController as the Initial View Controller

Ответ 3

Здесь является обходным путем для этого. Это похоже на ошибку в Xcode для iOS 7. Вам нужно создать фиктивный UINavigationController и связать все ваши бесплатные UIViewControllers с этим навигационным контроллером. Работал для меня.

Ответ 4

Для меня в моей раскадровке не было навигационного контроллера. Я создаю навигационный контроллер программно, который отлично работает в iOS8, но не iOS7.

Решение

  • В своем раскадровке выберите главный контроллер просмотра и в меню Xcode, выберите "Редактор" > "Вставить" > "Контроллер навигации".
  • Выберите новый контроллер навигации и в указателе атрибутов справа, в разделе "Контроллер просмотра" убедитесь, что установлен флажок "Контроллер начального просмотра".
  • Запустите приложение. Должно быть исправлено.

Ответ 5

Я считаю, что это ошибка в Xcode 7.2. Чтобы обходной путь, вы можете создать "Push (устаревший)" segue, а затем в редакторе раскадровки, выбрать сег и изменить его на Show (например, Push)

Ответ 6

У меня была эта точная проблема с "Показывать (например, Push)" на века, и я только что вычислил ее, пытаясь нажать контроллер вида на контроллер навигации, который находится в Popover. Кажется, что контекст вызываемого View Controller является проблемой. Так я решил это:

  • В диспетчере представлений, выполняющем Segue, проверьте свойство "Определить контекст" в раскадровке.
  • В вызываемом контроллере просмотра установите для свойства Presentation значение "Current Context".

Ответ 7

Я столкнулся с этой проблемой, и единственным решением, которое я нашел для меня, является использование устаревшего "Push" segue.

Ответ 8

В основном ответ Jomafer отчасти верен. Контролеру, которому вы нажимаете, должен предшествовать UINavigationController. Вам вообще не нужно толкать UINavigationController. Пока раскадровка знает его внутри UINavigationController, все хорошо.

Ответ 9

Я использую XCode 9 с Swift 4. Обратите внимание, что эта версия вышла вчера (20 сентября).

Для меня это была просто ошибка кэширования. Мне пришлось выбирать "Present Modally", запустить приложение, а затем выбрать "Показать (например, Push)". Теперь все работает нормально.

Ответ 10

В моем случае проблема заключалась в том, что я создал Show (например, Push) segue до, поставив ViewController как rootViewController из UINavigationController. Другими словами, у меня не было UINavigationController. Затем я удалил seque, добавил UINavigationController и снова добавил seque, и он сработал. Протестировано на Xcode 9.0.1/iOS 11.0.3.

Ответ 11

Когда "Show" segue появляется как модальный тест при тестировании, это обычно одна из двух проблем:

  • Первый контроллер просмотра не находится внутри контроллера навигации.

  • XML раскадровки поврежден.

Решение для # 2 обычно заключается в удалении и замене segue, и оно должно исправляться. Иногда просто переключается на другой стиль презентации, работает и переключается обратно в "Показать", исправляет его.

Это также может произойти с "Show Detail" segues, и это может быть более коварным.

Пример: У меня есть серия контроллеров представлений, расположенных в UISplitViewController. У них есть показы Show- > Show- > Show- > Show Detail. Последний переход продолжал идти модально. Я попробовал все, чтобы исправить этот последний сеанс. Проблема заключалась в том, что восходящий Show segue был поврежден в серию Show Detail (хотя раскадровка все еще говорила, что это Show Segue). Я тестировал iPhone, и я не обнаружил настоящую проблему, пока не запустил ее на симуляторе iPad. Сегменты теперь были показаны Show- > Show- > Show Detail- > Show Detail. На iPhone третий сегмент выглядел так же, как Show, потому что он рухнул на контроллер навигации. Тем не менее, он по-прежнему является контроллером подробных представлений, и вы не можете иметь Show Detail из контроллера подробных представлений, поэтому ОС делает все возможное, чтобы получить ваш контроллер просмотра на экране и отобразить его по-разному.

Урок 1: Всегда проверяйте свой UISplitViewController на iPad, чтобы убедиться, что segues делает то, что вы думаете.

Урок 2: Если ваш сеанс неожиданно появляется модально, проверьте восходящие последовательности на предмет коррупции, а также на соответствующий вопрос.