我正在从硬编码布局转移到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的类。这些都不是很好的选择,所以我想知道:我还有其他选择吗?我错过了我提出的解决方案的任何问题吗?
答案 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...
}
}