如何在iOS 7上使用带有通用故事板的popover segues?

Bil*_*ill 11 storyboard ipad ios ios-universal-app

我正在从硬编码布局转移到Xcode 6中可用的新通用故事板系统.能够创建一个故事板,通过自动布局的魔力,可以在iPhone和iPhone上运行,这很棒. iPad.我的理解是,通用故事板与iOS 7向后兼容.

但是,我遇到了使用popover segues的问题.在iOS 8上,新的"Present as Popover"segue将在iPad界面上显示为弹出式窗口,并在iPhone界面上显示为模态视图控制器.这正是我想要的行为,但是当我在iOS 7上运行我的通用故事板时,每当我尝试使用popover segue时,应用程序都会崩溃.这是我收到的错误消息:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[UIPopoverController initWithContentViewController:] called when not 
running under UIUserInterfaceIdiomPad.'
Run Code Online (Sandbox Code Playgroud)

这有点烦人,因为我不想为每个UI成语使用单独的故事板.

看起来这些是我的选择:

  • 创建一个子类UIStoryboardSegue,它将在iPad上显示弹出窗口并在iPhone上显示模态视图.这需要手动更改我的应用程序中所有popover segues的类.
  • 从每个条形按钮项目,表格单元格等中创建两个segue - 一个是纯粹的'Popover'segue,另一个是纯粹的'Modal'segue.在这种情况下,我将无法控制 - 拖动到下一个屏幕,并将不得不创建自定义操作方法,将根据当前的UI惯用法调用正确的segue.
    • 放弃通用故事板并创建特定于设备的故事板,直到我可以向用户请求iOS 8.

这些都不是很好的选择,所以我想知道:我还有其他选择吗?我错过了我提出的解决方案的任何问题吗?

小智 -1

看起来你正在尝试以模态方式呈现你的视图,如果设备是 iPhone,如果设备是 iPad,则以 Popover 的形式呈现。要产生这种效果,最简单的方法是在事件发生时检查 InterfaceIdiom(如按钮单击),并有条件地使用适当的方法。

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