如何在同一视图控制器(iOS)中应用具有相同元素的不同UI?

时间:2015-12-18 16:17:59

标签: ios user-interface layout constraints

我在Xcode 7中使用Swift和Storyboard。我在同一个视图控制器中有不同的UI和相同的元素。根据从服务器获取的数据,我希望显示不同的UI布局。

为了更容易理解,例如我有一个视图控制器,其中一个标签与视图的底部对齐。在从服务器获取数据时,我想显示具有不同布局的标签:

  • 如果服务器将layout作为bottom返回,我会将文字布局应用为align bottomcentre horizontally
  • 如果服务器将layout作为centre返回,我想将文字布局应用为centre verticallycentre horizontally

因此,如果我有很多元素,我就很难手动编写NSLayoutConstraint。无论如何我仍然可以使用Interface Builder来创建应用于同一视图控制器的不同UI吗?

1 个答案:

答案 0 :(得分:0)

之前我遇到过同样的问题并且设法提供了一个解决方案,尽管可能不是苹果的意图。我测试过,它适用于xcode 6和7,也可能是早期版本。您的问题并未说明您是否正在使用笔尖或故事板,但我提供的答案是笔尖。要设置您的笔尖,您需要添加2个视图控制器或更多。按照您需要的方式查看视图控制器并设置视图控制器的主视图标记,以便区分它们。为了能够连接您的IBOutlets,您需要应用一些技巧:

  • 您设置了第一个视图控制器的类,以便您可以连接 网点。
  • 您连接插座。您删除了中的类名 属性检查员。 (注意笔尖中的插座留有 连接,但在.m或.h文件中,他们表明它们不是。如果你 现在尝试建立你的项目它会失败。)
  • 您可以设置第二个视图控制器的类,以便再次连接插座。
  • 您再次连接插座。您在第一个视图控制器的属性检查器中重新输入类名。

现在你只需要访问你的视图控制器。为此,我使用类方法来获取视图控制器的实例:

+ (UIViewController *)customViewControllerForLayout:(NSInteger)layoutTag
{
    NSArray *customViewControllers = [[NSBundle mainBundle] loadNibNamed:@"Your nib's name" owner:self options:nil];

    __block UIViewController *customViewControllerWithSpecifiedLayout = nil;
    [customViewControllers enumerateObjectsUsingBlock:^(UIViewController *customViewController, NSUInteger index, BOOL *stop) {
        if (customViewController.view.tag == layoutTag) {
            customViewControllerWithSpecifiedLayout = customViewController;
            *stop = YES;
        }
    }];

    return customViewControllerWithSpecifiedLayout;
}