UISplitViewController iOS 7向后兼容性

时间:2014-09-26 12:16:51

标签: ios7 swift ios8 uistoryboard uisplitviewcontroller

在Xcode 6中,我正在构建一个具有UISplitViewController的通用应用程序。在iOS 8小型设备上,它看起来像是普通的主/细节关系,但在较大的设备上,您同时可以看到主视图和详细视图。

这适用于iOS 8,但我也需要它支持iOS 7. iOS 7仅支持iPad的UISplitViewController,而我目前用于iPad和iPhone。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

@macworth,杰克说这是可能的,但我不确定你是否可以从代码中做到这一点。然而,当使用故事板时,我也遇到了问题(获得相同的#34;仅在UIUserInterfaceIdiomPad"例外情况下运行时支持)。经过大量的研究,我发现这是因为我使用的是旧的xcode导入项目,而且没有为故事板启用使用大小类复选框。启用后,xcode升级了项目,并且运行正常。

我还必须进行一些调整来处理使用导航控制器而不是拆分视图控制器的情况。特别是,在默认的xcode拆分视图控制器项目中,我必须进行以下#if 1' d更改为prepareForSeque():

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDate *object = self.objects[indexPath.row];

#if 1
        DetailViewController *controller = nil;
        if ([segue.destinationViewController isKindOfClass:[UINavigationController class]]) {
            controller = (DetailViewController*)[segue.destinationViewController topViewController];
        }
        else if ([controller isKindOfClass:[UISplitViewController class]]) {
            controller = segue.destinationViewController;
        }
#else
        DetailViewController *controller = (DetailViewController*)[[segue destinationViewController] topViewController];
#endif
        [controller setDetailItem:object];
        controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
        controller.navigationItem.leftItemsSupplementBackButton = YES;
    }
}

答案 1 :(得分:0)

实际上,我发现如果使用SDK 8(Xcode 6)构建,UISplitViewController也适用于运行iOS 7的iPhone。可以使用以下警告运行默认示例项目:

  • 主视图控制器和详细视图控制器由拆分视图控制器直接控制。

  • 视图控制器数组包含仅对主视图控制器的直接引用;细节视图控制器不存在。

  • 由于上述原因,您无法在主视图和详细视图控制器中显示工具栏,因为这些工具栏是使用导航控制器控制的。

  • 当您未实施任何新的拆分视图委托协议方法时,您可能会注意到详细视图控制器以纵向模式显示; this question可以解答这个问题。

顺便说一句,从我的短暂实验中我发现,对于iOS 7和8,Autolayout指南在细节视图中有点不稳定;顶部或底部布局指南的对齐必须分别调整为-64和-44。

在iOS 7.1.2上使用iPhone 4S测试上述内容

答案 2 :(得分:0)

我有同样的问题。在UISplitViewController委托中添加对旧委托方法的引用

///
/// Used by iOS 7 iPad
///
- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
    return NO;
}

这样做是为了在iOS 7 iPad上同时显示主人和细节,就像在iOS 8中一样