如何在 iOS 7 上使用通用Storyboard来实现弹出视图过渡?

11

我正在将硬编码布局转换为Xcode 6中可用的新通用故事板系统。通过自动布局的神奇魔力,可以创建一个故事板,适用于iPhone和iPad,这真是太棒了。我的理解是,通用故事板与iOS 7向后兼容。

但是,我在使用弹出窗口过渡时遇到了问题。在iOS 8上,“呈现为弹出窗口”过渡会在iPad界面上显示为弹出窗口,在iPhone界面上显示为模态视图控制器。这恰好是我想要的行为,但是当我在iOS 7上运行我的通用故事板时,每当我尝试弹出窗口过渡时应用程序就会崩溃。以下是我收到的错误消息:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[UIPopoverController initWithContentViewController:] called when not 
running under UIUserInterfaceIdiomPad.'

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

看起来我的选择是:

  • 创建UIStoryboardSegue的子类,它将在iPad上显示弹出窗口,在iPhone上显示模态视图。这需要手动更改应用程序中所有弹出窗口segue的类。
  • 对于每个导航栏按钮项、表格单元格等,创建两个segue - 一个纯粹的“Popover”segue和一个纯粹的“Modal”segue。在这种情况下,我将无法直接控制拖动到下一个屏幕,而必须创建自定义操作方法,根据当前的UI习惯调用正确的segue。
    • 放弃通用故事板并创建设备特定的故事板,直到我可以要求我的用户使用iOS 8。

这些都不是很好的替代方案,所以我想知道:我有其他选择吗?我是否忽略了任何与我的解决方案相关的问题?


1
我遇到了完全相同的问题。目前我正在采用自定义segue路线,因为我觉得这是最不烦人的方法,但我对此并不是很满意。 - Erik Tjernlund
3个回答

1
Xcode 6支持统一的故事板。一个故事板可以基于视图控制器显示的大小类别添加或删除视图和布局约束。您可以为多个大小类别创建单个故事板,而不是维护两个独立(但相似)的故事板。
但是,大小类是基于UITraitCollection的,该功能仅在iOS8上受支持。这就是为什么在iOS7上会崩溃的原因。

1
这应该是注释,因为你没有回答问题。 - vishwa.deepak

0

最后我使用了一个模态转场并检查代码,以确定它是否在运行iOS 7的iPhone上。然后我使用了performWithSegue来选择应该采取哪个转场。iOS 8可以处理弹出窗口代码,但iOS 7存在问题。


-1

看起来您正在尝试在 iPhone 设备上以模态方式呈现您的视图,而在 iPad 设备上以 Popover 方式呈现。 最简单的方法是在事件发生时(如按钮点击)检查 InterfaceIdiom,并有条件地使用适当的方法。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接