Ios 最佳实践:为单表视图到双表视图使用大小类

Ios 最佳实践:为单表视图到双表视图使用大小类,ios,swift,uitableview,autolayout,size-classes,Ios,Swift,Uitableview,Autolayout,Size Classes,我知道“最佳实践”是stackoverflow的禁忌,但我还是要尝试一下,因为我认为这很重要,需要一个具体的答案。自动布局是一项新技术,随着最近发布的iPad并行多任务处理,自动布局的细微差别变得前所未有的重要 我的情况:我的应用程序将有两个列表。在iPhone上,一次只能浏览一次。我可以做到这一点: 带有一个ViewController,可以在两个列表数据数组之间切换 有两个ViewController,每个都有自己的tableView和数据 一个ViewController和两个表,但其中一

我知道“最佳实践”是stackoverflow的禁忌,但我还是要尝试一下,因为我认为这很重要,需要一个具体的答案。自动布局是一项新技术,随着最近发布的iPad并行多任务处理,自动布局的细微差别变得前所未有的重要

我的情况:我的应用程序将有两个列表。在iPhone上,一次只能浏览一次。我可以做到这一点:

  • 带有一个ViewController,可以在两个列表数据数组之间切换
  • 有两个ViewController,每个都有自己的tableView和数据
  • 一个ViewController和两个表,但其中一个始终隐藏
  • 更好的选择
  • 我的具体问题:在iPad上,我希望两个列表同时并排显示。iPhone和iPad都将只在纵向模式下运行应用程序(不支持横向模式)。我看到了几个提供并排视图的选项:

  • 不知道如何使用选项#1并排工作,除了以编程方式为iPad布局添加第二个表
  • iPhone版本的两个vc将在iPad版本中并排出现,使用以前隐藏的容器视图将VC2添加到VC1中
  • 两个表同时可见
  • 更好的选择

  • 对于如何实现这一功能,我将不胜感激。虽然我了解每个选项的概念,但我不了解具体的步骤/代码,因此希望您能详细解释。谢谢。

    我在我的应用程序中有这个确切的场景,我使用了选项2

    对于iPad,它将使用w-Regular h-Regular size类。 这有一个伟大的视觉和解释的大小类

    • 在Interface Builder中,切换到w-常规h-常规大小类

    • 在w-Regular和h-Regular中,从对象库(Interface Builder的右下角)拖出一个容器视图,并将其放置在视图中

    • 在w-Regular和h-Regular中,根据需要设置约束,以便在新布局中考虑容器视图。
      • 可能需要关闭现有约束。可以在约束中的“尺寸检查器”中执行此操作。请注意,下图中安装了my constraint。单击“已安装”复选标记左侧的+以在w-Regular h-Regular size类中将其卸载
      • 卸载约束的另一种方法是在屏幕对象的“大小检查器”中高亮显示约束,然后按delete键。它实际上并没有删除约束,只是将其从当前大小类中卸载

    • 将VC链接到容器视图。ctrl从容器拖动到VC以创建嵌入序列。您还需要添加代码,以便在iPad上仅使用此嵌入式segue。通过在IB中选择segue并转到属性检查器,为segue提供一个标识符。在下面的示例代码中,我将segue称为embeddeseguename

      - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender  {
      
          if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [identifier isEqualToString:@"EmbedSegueName"]) {
              return YES;
          }
      
          return NO;
      }
      
    • 不允许访问第二个VC。我不知道你是如何在iPhone上显示这两个不同的VCs的,但在我的应用程序中,我使用的是
      uitabbarcontroller
      。这就是我如何在我的应用程序中从iPad的选项卡栏中删除额外VC的方法

      if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
      
          //  Remove the tab bar item because it will be contained in the iPad's layout.
          //  In this example, it's removing the 2nd tab bar item.
          NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
          [viewControllers removeObjectAtIndex:1];
          [self.tabBarController setViewControllers:viewControllers animated:YES];
      }
      
    提示:如果您在运行iPhone版本时遇到错误,并且它抱怨容器视图(即使它没有安装在iPhone的大小类上),请尝试将容器视图放到另一个视图中,看看这是否解决了问题


    我希望这足以让您开始。

    谢谢!这是我在任何论坛上读到的最清晰的解释之一。