'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?
Любая помощь приветствуется...
Спасибо
Ответы
Ответ 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 появляется как модальный тест при тестировании, это обычно одна из двух проблем:
Решение для # 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: Если ваш сеанс неожиданно появляется модально, проверьте восходящие последовательности на предмет коррупции, а также на соответствующий вопрос.