2014-09-26 88 views
2

在Xcode 6中,我构建了一个具有UISplitViewController的通用应用程序。在iOS 8设备很小的情况下,它看起来像一个普通的主/细节关系,但在较大的设备上,您可以同时看到主视图和详细视图。UISplitViewController iOS 7向后兼容性

这非常适用于iOS 8的,但我也需要它来支持的iOS 7,iOS的7支持UISplitViewController只为台iPad,而我现在有它同时用于iPad和iPhone。

我该如何解决这个问题?

+0

我师傅和细节我不确定你要求的是什么...'[[UIDevice currentDevice] systemVersion]'听起来太简单了。 :) – 2014-09-27 13:50:29

+0

@PhillipMills所以在AppDelegate中,我将不得不根据版本在两个故事板之间切换? – erdekhayser 2014-09-27 13:57:45

回答

0

其实,我发现UISplitViewController适用于运行iOS 7,以及如果你建立一个使用SDK 8(6的Xcode)的iPhone;默认实例项目可以用下面的警告运行:

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

  • 视图控制器的阵列包含的直接引用,只有主视图控制器;详细视图控制器不在那里。

  • 由于上述的直接后果,你不能显示你的主人和细节视图控制器内的工具栏,因为那些使用导航控制器来控制。

  • 如果不实施任何的新的分割视图委托协议方法,可能会看到注意到细节视图控制器被示出在纵向模式; this question有问题的答案。

顺便说一句,从我的短实验我发现对于不论是iOS 7和8个中的自动布局导板位于细节视图有点靠不住;顶部或底部布局指南的路线必须分别调整为-64和-44。

测试以上iPhone 4S的iOS上7.1.2

+0

嗯,我正在使用Xcode6.1,SDK 8.1,iPhone 4s模拟器7.1。温家宝我做的, 'UISplitViewController *分= [[UISplitViewController的alloc]初始化]' 我得到 'UISplitViewController仅支持UIUserInterfaceIdiomPad' 任何建议下运行时? – mackworth 2014-10-28 20:19:33

+1

@mackworth我认为他们只在使用接口构建器时才使它兼容:) – 2014-10-28 22:06:22

+0

Aha;这解释了它。谢谢! – mackworth 2014-10-29 01:15:29

1

@macworth杰克说,这是可能的,但我不知道您是否可以从代码做到这一点。不过,我还遇到了一个问题(使用故事板时,只能在UIUserInterfaceIdiomPad下运行时才能支持)。经过多次磨牙之后,我发现这是因为我使用的是旧的xcode导入项目,并且没有为故事板启用使用尺寸类复选框。启用后,xcode升级了该项目,并且它工作正常。

我也不得不做出一些调整来处理情况,导航控制器是用来代替一个拆分视图控制器的情况。特别是,在默认的Xcode拆分视图控制器项目,我不得不作出以下的#if 1了改变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; 
    } 
} 
0

我有同样的问题。在您的UISplitViewController委托添加参照旧的委托方法

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

这样做,使得它,这样在iOS 7 iPad的它显示在同一时间像它在iOS的8