Как использовать popover segues с универсальной раскадровкой на iOS 7?

Я сейчас перехожу из жестко закодированных макетов к новой универсальной системе раскадровки, доступной в 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.

Ни одна из них не является отличной альтернативой, поэтому мне было интересно: есть ли у меня другие варианты? Имею ли я какие-либо проблемы с моими предлагаемыми решениями?

Ответ 1

Xcode 6 поддерживает унифицированные раскадровки. Раскадровка может добавлять или удалять ограничения вида и макета на основе класса размера, в котором отображается контроллер представления. Вместо того, чтобы поддерживать две отдельные (но похожие) раскадровки, вы можете сделать одну раскадровку для нескольких классов размера.

Но классы размера основаны на UITraitCollection, который поддерживается на iOS8. Вот почему он рушится на iOS7.

Ответ 2

Я закончил тем, что сделал modal segue и проверил код, чтобы увидеть, было ли это на iPhone с iOS 7. Затем я использую performWithSegue, чтобы выбрать, какой segue следует принять. iOS 8 может обрабатывать код popover, но у iOS 7 есть проблемы.

Ответ 3

Похоже, вы пытаетесь представить свое мнение, если устройство является iPhone и как Popover, если устройство iPad. Чтобы сделать это, проще всего проверить интерфейс InterfaceIdiom при возникновении события (например, щелчок кнопки) и условно использовать соответствующий подход.

-(IBAction)btnClicked:(id)sender{
    if([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad){
        //your popover code..
    }else{
        //your present modaly code...
    }
}