Я сейчас перехожу из жестко закодированных макетов к новой универсальной системе раскадровки, доступной в Xcode 6. Это здорово, когда вы можете создать одну раскадровку, которая благодаря магии автомакета будет работать как на iPhone и iPad. И я понимаю, что универсальные раскадровки обратно совместимы с iOS 7.
Однако я столкнулся с проблемой, использующей popover segues. На iOS 8 новый сегмент "Present as Popover" будет отображаться как "popover" на интерфейсе iPad и в качестве модального контроллера представления на интерфейсе iPhone. Это именно то поведение, которое я хочу, но когда я запускаю свою универсальную раскадровку на iOS 7, приложение падает каждый раз, когда я пытаюсь выполнить popper segue. Здесь появляется сообщение об ошибке:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[UIPopoverController initWithContentViewController:] called when not
running under UIUserInterfaceIdiomPad.'
Это немного раздражает, так как я не хочу прибегать к отдельным раскадкам для каждого идиомы пользовательского интерфейса.
Похоже, что это мои варианты:
- Создайте подкласс
UIStoryboardSegue
, который покажет popover на iPad и модальный вид на iPhone. Это требует ручного изменения класса всех popper segues в моем приложении. - Создайте два сегмента из каждого элемента кнопки панели, ячейки таблицы и т.д. - тот, который представляет собой чистый "Popover" и один, который является чистым "Модальным". В этом случае я не смогу просто перетащить управление на следующий экран и вам придется создавать настраиваемые методы действий, которые будут вызывать правильный сегмент на основе текущей идиомы пользовательского интерфейса.
- Уничтожьте универсальные раскадровки и создайте раскадровки, специфичные для устройства, до тех пор, пока я не буду требовать от своих пользователей iOS 8.
Ни одна из них не является отличной альтернативой, поэтому мне было интересно: есть ли у меня другие варианты? Имею ли я какие-либо проблемы с моими предлагаемыми решениями?