Конструктор интерфейса Xcode 6 по умолчанию имеет новый флажок «использовать классы размера». Это делает представления адаптивными.
Когда я пытаюсь сделать переход между двумя представлениями в моей раскадровке, у меня появляются новые возможности:
вместо старого:
Теперь у нас есть «показать» и «представить модально» вместо «push» и «модально». Старые параметры отмечены как устаревшие. Я выбрал вариант «показать», потому что в настройках перехода он называется «показать (например, нажать)».
Но толчка это не дает. Анимация перехода выглядит как слайд снизу (модальный), а панель навигации исчезает.
Вопрос: как заставить "шоу" работать как толчок? Возможно ли это, или я должен использовать вместо этого "push (устаревший)"? Где я могу найти информацию о новых типах переходов? Единственное, что я нашел в библиотеке разработчика iOS8, - это раскадровки, которые помогут вам разработать свой пользовательский интерфейс, но нет никакой информации о переходе «показать».
ОБНОВИТЬ
Я попытался создать новый проект, и «шоу» действительно работает как «толчок». Я думаю, что проблема в моем проекте может быть связана с тем, что я повторно использую контроллер навигации с таким кодом, но я не знаю, как это исправить.
if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[dvc] animated: NO ];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
};
}
После этого я пытаюсь нажать NewViewController после MainViewController
ОБНОВЛЕНИЕ 2:
У меня вроде только iOS 7, проблема iOS 7.1.
источник
Уже есть принятый ответ, но я хотел бы дать немного больше информации, возможно, информации, которой раньше не было.
Как упоминалось ранее, сегменты «push» и «modal» устарели и были заменены на «show» и «present modally» соответственно. Согласно документации Apple, новые сегменты были дополнительно разделены на сегменты, которые адаптируются к классам размеров. Старые версии следует использовать только для поддержки версий iOS старше iOS 8.
Документ по следующей ссылке объясняет это и описание всех доступных сегментов, старых и новых.
Добавление перехода между сценами в раскадровке
В случае, если URL-адрес изменится в будущем, для каждого нового перехода приводится следующее объяснение:
источник
В других ответах нет ничего плохого, но этот объясняет, что происходит, как вы можете проверить, что это происходит, и как решить проблему в будущем.
Задний план
В моем случае ни один из моих сегментов шоу не работал, хотя у меня уже был UINavigationController в качестве исходного контроллера представления (с моим содержимым UIViewController в качестве корневого).
Почему и как ломается переход к шоу
Переход «Показать» прерывается, когда с ним связано действие в исходном xml-файле раскадровки. Типичный сценарий, вызывающий это, может быть, если вы переопределили переход из ручного перехода, ранее вызванного в коде. Это оставляет следующие биты в раскадровке xml.
Чтобы учесть любые настраиваемые действия при использовании перехода из раскадровки, можно просто нажать на prepareForSegue и перехватить целевой контроллер представления и вызвать любые методы из этого места. В любом случае, побочный эффект для этой маленькой ошибки (ошибка заключается в том, что когда вы переопределяете переход, он неправильно настроен в xml ~ т.е. действие остается даже после того, как вы измените переход на тот, который работает из UIView (или UIControl) в целевой контроллер представления).
К сожалению, самое прямое решение не удается. Поэтому простое удаление атрибута xml для действия из раскадровки НЕ решит проблему. Вместо этого нужно просто удалить и воссоздать переход в раскадровке.
При воссоздании в раскадровке xml больше не будет действий, связанных с конкретным сегментом, и Show будет выполняться как Push.
Образец XML для правильного перехода к шоу
смягчение
Чтобы предотвратить повторение, нужно просто придерживаться не ручных переходов раскадровки, если это возможно, используя prepareForSegue для добавления необходимых действий на основе контроллера представления назначения. Или, если вам нужно смешивать и сопоставлять, примите меры предосторожности, чтобы убедиться, что ваши сегменты шоу не имеют никаких действий, прикрепленных в xml раскадровки. Если вы имеете дело со старыми проектами, вам следует уделить особое внимание исходному коду раскадровки, поскольку я обнаружил несколько проблем.
источник
Как здесь прокомментировал Скотт Робертсон , это похоже на ошибку в iOS 7.
Похоже, что в iOS 8 переход определяется во время выполнения (правильное поведение), а в iOS 7 переход определяется во время разработки (ошибочное поведение).
Самый простой обходной путь - добавить неиспользуемый контроллер навигации к раскадровке и связать его так, чтобы рассматриваемый контроллер представления стал частью этого контроллера навигации. На самом деле вам не нужно создавать экземпляр контроллера навигации, вам просто нужно, чтобы контроллер представления с ошибками знал, что он встроен в контроллер навигации.
Примечание: имитации панели навигации для этих целей недостаточно; у вас должен быть контроллер навигации в стеке push-уведомлений.
Чтобы воспроизвести ошибку:
initWithRootViewController:
метода.Чтобы исправить ошибку:
workaround for show segues in iOS 7
).Обратите внимание, как на втором рисунке был добавлен контроллер навигации и что у него нет никаких входящих стрелок (т.е. нет другого способа создать его экземпляр, кроме использования идентификатора контроллера представления).
источник
Я знаю, что опаздываю с этим, но я хотел поделиться тем, что я узнал. На самом деле это ошибка, которая существует и сегодня (18 декабря 2014 г.).
Я написал об этом статью здесь .
Это легко воспроизводимо; на iOS8 будет работать нормально и даже в iOS7.x до тех пор, пока вы не вставляете программный контроллер представления в стек перед вызовом
Show
segue.Если вы отправляете в стек только соединения с раскадровкой, это сработает; но, очевидно, если вы каким-то образом нажмете код,
navigationController
свойство нажатогоUIViewController
будетnil
и когда вы вызоветеShow
он будет считать его модальным, потому что нет навигации для управления стеком.Единственным обходным решением на данный момент является либо не проталкивание через код (что невозможно), либо использование устаревшего
Push
.Подала радар (ссылка на статью). Не стесняйтесь отправлять дубликаты в надежде, что Apple решит эту проблему.
источник
Show
переход, затем на второмShow
этапе он отображается модально. Решение?Show
viewController на iOS 7У меня была такая же проблема с переходами в Xcode 7 и iOS 7.1.2. Показать переходы (новая функция в iOS 8) работает как модальные переходы в iOS 7 и не позволяет вам помещать ваши контроллеры представления в стек контроллера навигации, когда вы определяете тип перехода с помощью Xcode в раскадровке. Вот почему ваш self.navigationController вернет nil, потому что контроллер представления не был помещен в стек, и вы не можете его вставить.
Я не понимаю, почему Apple не добавила никаких уведомлений для этого случая в Xcode, когда вам нужно, чтобы ваше приложение работало на iOS 7. Они говорят, что метод Push устарел, но Show не работает правильно с iOS 7.
Что я сделал для решения проблемы:
Я создал класс MYShowSegue с .h
И файл .m только с одним методом выполнения :
Затем вам нужно установить пользовательский тип для каждого сегмента в вашей раскадровке и выбрать для него новый класс, в моем случае это был MYShowSegue.
Пример настраиваемого перехода
Это решение поможет вам получить полную поддержку ваших приложений iOS 7, они будут использовать метод pushViewController для отправки ваших просмотров, а для iOS 8,9 и т. Д. Ваш переход будет работать с новым (iOS 8) методом showViewController
Не забудьте сделать то же самое со всеми своими сегментами в раскадровке.
источник
Это все еще происходит в iOS 10.x
Удаление и повторная установка сегментов для меня ничего не решило:
Проблема: Требуемая функциональность - это 7 сегментов, которые работают только как «push» (фактически, это деталь шоу), но на самом деле только первый добавленный мной сегмент будет толкать, остальные будут вести себя модально. И это несмотря на то, что Interface Builder идентично описывает каждый из сегментов.
Решение: мне пришлось добавить действие к 6 сегментам, на которых его не было.
Исходная раскадровка в формате XML
Я изменил это, добавив showViewController: sender
источник