【问题标题】:Storyboards, view controllers, and segmented controls故事板、视图控制器和分段控件
【发布时间】:2012-10-06 17:39:36
【问题描述】:

我在情节提要中有一个带有分段控件的视图控制器。分段控制从三种不同类型的显示器切换视图。为此,我隐藏/取消隐藏各种视图元素。这可行,但很难在 Xcode 故事板编辑器中编辑。我希望能够根据我正在处理的视图部分打开和关闭图层。

有没有办法做到这一点?有没有更好的办法?

更新:

我倾向于在单独的 xib 文件中创建三个视图,并根据需要将它们加载到视图控制器视图中。

【问题讨论】:

  • 使用标签栏控制器怎么样?
  • 标签栏已被使用。分段控制在同一对象的不同视图之间切换。
  • 我会手动分页 UIPageViewController,并禁用用户滚动。

标签: ios


【解决方案1】:

您可以在一个 Storyboard 文件中创建三个不同的 ViewController,并为每个视图控制器指定一个 Storyboard ID。不要将它们与 segue 连接。然后,您将容器视图拖放到您希望它们显示的位置并删除自动生成的 ViewController。

然后,对我来说,以下代码有效:

-(void)loadSubviewAtIndex:(NSUInteger)idx;
{
    [self.subviewController.view removeFromSuperview];
    [self.subviewController removeFromParentViewController];

    NSString* subviewIdentifier = [self.subviewIdentifiers objectAtIndex:idx];
    subviewController = [self.storyboard instantiateViewControllerWithIdentifier:subviewIdentifier];
    CGRect frame = self.view.bounds;
    subviewController.view.frame = frame;

    [self.view addSubview:self.subviewController.view];
    [self addChildViewController:self.subviewController];
}

在这里,我假设您有一个属性 subviewIdentifiers,它是一个 NSArray 和一个分段控件索引到 Storyboard ID 的隐式映射,以及一个将容器视图链接到的 IBOutlet UIViewController* subviewController。只需从分段控制操作中调用此方法即可。

【讨论】:

  • 这是一个很好的答案,但它有我所认为的缺陷。具体来说,调用 [self.view addSubview:self.subviewController.view](参见blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers)。我确实认为这里有一个解决方案的内核:使用容器视图来切换自定义 UIViews,在他们自己的 xib 文件中定义,进出。
  • 好点,可能你是对的,应该避免像上面的代码那样手动设置子视图。但是,您引用的文章有点过时了。这是苹果范式的明显转变,允许每个屏幕有多个视图控制器。他们在 API 和 IB 中提供了必要的工具,即视图控制器包含,我同意,我可能不会按预期使用。话虽如此,我认为,虽然可以同时使用 Storyboard 和 XIB,但应该尽可能避免。
  • 抱歉,我一定遗漏了一些关于给出的解决方案非常明显的东西。它指出: > ...一个 IBOutlet UIViewController* subviewController,您将容器视图链接到该子视图控制器。 ...但是如何将容器视图(即 UIView)链接到定义为 UIViewController 的 IBOutlet?就目前而言,我有一个包含容器视图的视图控制器。 IBOutlet 是在我的视图控制器代码中定义的,所以我没有任何东西可以链接到它。困惑:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2012-04-19
  • 2021-08-05
  • 2015-05-18
相关资源
最近更新 更多