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

时间:2014-10-06 17:50:48

标签: ios ipad storyboard ios-universal-app

我正在从硬编码布局转移到Xcode 6中提供的新通用故事板系统。很高兴能够创建一个故事板,通过自动布局的魔力,它将同时适用于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.'

这有点烦人,因为我不想为每个用户界面习惯使用单独的故事板。

看起来这些是我的选择:

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

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

3 个答案:

答案 0 :(得分:1)

Xcode 6支持统一的故事板。故事板可以根据视图控制器显示的大小类添加或删除视图和布局约束。您可以为多个大小的类创建一个故事板,而不是维护两个单独(但相似)的故事板。

但是Size类基于iOS8支持的UITraitCollection。这就是它在iOS7上崩溃的原因。

答案 1 :(得分:0)

我最终制作了一个模态segue并检查代码以查看它是否在iOS 7的iPhone上。然后我使用performWithSegue来选择应该采用的segue。 iOS 8可以处理弹出代码,但iOS 7存在问题。

答案 2 :(得分:-1)

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

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