【问题标题】:reuse view from storyboard重用情节提要中的视图
【发布时间】:2011-12-18 23:50:33
【问题描述】:

我有一个带有自定义部分标题的表格视图。节标题的视图在情节提要中定义并连接到实例变量。有没有办法从情节提要中请求视图的新实例?

过去,我通过在自己的 xib 文件中定义节头并使用

获取新实例来做到这一点
[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil];
UIView *newHeaderView = self.sectionHeaderView;

【问题讨论】:

    标签: iphone ios ipad uistoryboard


    【解决方案1】:

    我不认为有办法做到这一点。最好的办法是将 tableview 自定义标题视图放在单独的 nib 中,并在需要时像在代码示例中那样加载它。

    【讨论】:

    • +1 来自我。我花了几个小时试图弄清楚如何以 Storyboard 的方式来查看表格标题,因为我认为 Storyboard 是布置我的应用程序 UI 的新的和改进的方式。不幸的是,使用 Storyboard 无法在该部门交付,最好的解决方案是回到为视图加载 nib 或通过代码构建视图的旧方式。我真的很想相信我的应用程序的所有 UI 都可以在一个 Storyboard 文件中完成,但事实并非如此。
    【解决方案2】:

    我尝试做同样的事情并遇到了同样的问题。

    我非常喜欢使用情节提要,并且对我创建工作 UI 的速度印象深刻。但是,一旦您需要重用视图,将它们与其 UIViewController 子类一起放入单独的 nib 是很有意义的。

    然后,您可以将通用 UIView 放置在您的重用视图应该去的所有地方,并使用您的 ViewController 添加视图:

    [myReusableViewController loadView];
    [myReusableViewController viewDidLoad]; // You have to handle view callbacks yourself.
    
    [self.myReusableViewPlaceholder addSubview:myResusableViewController.view];
    [myReusableViewController viewWillAppear:YES];
    

    总结一下:

    • 使用故事板,很棒
    • 在情节提要中创建应用程序的脚手架,以及任何静态视图(如关于屏幕等)
    • 在自定义 nib + UIViewController 子类中创建重复使用的视图,并在情节提要中添加 UIView 占位符。

    在另一个答案中,我想到了一些Pros and Cons of Storyboard

    【讨论】:

    • 你确定你必须自己调用回调 - 这对我来说看起来很奇怪
    • 尽管如此 +1 用于使用 UIView 作为占位符的想法。请注意,您可以将其与上面 Krejko 的答案结合使用,而不是从 nib 加载控制器,而是从故事板加载它(您可以使用一个故事板来保存一堆杂项视图)
    • @Rhubarb 我不能 100% 确定您必须自己进行回调,但如果您嵌入视图,那么您似乎有责任调用它。请注意,在 iOS6.0 中,有一种新机制可以使用 Embed Segue 将整个 ViewController 嵌入到当前视图控制器的区域中。这也可能是一种选择。
    【解决方案3】:

    我为此提出的解决方案如下:

    我有一个表格视图,其中包含多个显示复杂数据的原型单元格。详细视图和事务处理视图有一个 segue。

    第一个 tableview 有一个搜索按钮,它显示一个带有结果的新 tableview。它需要与推送它的主 tableview 相同的功能;包括细节和交易进度视图的segues:

    在情节提要上,选择并复制您的主表视图。取消选择并粘贴。创建从主表视图到第二个表视图的推送序列;或从您想从哪里导航到它。根据需要修改第二个表格视图。 IE:如果它需要一些 UI 更改没问题。

    创建一个新的 viewcontroller 类,它是运行主 tableview 的 viewcontroller 的子类。

    覆盖子类中的数据委托以提供所需的数据子集。

    返回故事板,选择您的第二个 tableview 控制器,然后在身份检查器中选择您的子类作为自定义类。

    要使此解决方案顺利运行,您的应用确实需要管理视图数据。您可以使用 prepareforsegue 将数据从第一个 tableview 传递到第二个,但我发现从许多角度来看,应用程序数据模型更加灵活。

    除非您有通过 segue 推送到子视图的按钮,否则您的子类将需要覆盖通过带有身份的 segue 推送的函数。 NB Segues 必须有唯一的标识符,如果你 id 的话。

    这需要大量的尝试和错误才能弄清楚,但是一旦您理解了这个概念,它就会是一个相对顺利的解决方案,具有很强的适应性并且实施起来也不错。

    【讨论】:

      【解决方案4】:

      我不确定视图,但我能够从我的故事板中获取视图控制器的方式如下。

      UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"IdentifierName"];
      

      从这里,也许您可​​以像以前使用 nib 一样使用它。

      【讨论】:

        【解决方案5】:

        我已经能够重用情节提要中的一个视图,只需将一个表格视图的转换连接到我想要重用的那个。

        所以我想要重用的 tableview 被指向两次。 它有点工作,但我遇到的问题是在我的应用程序委托中设置一个变量(使用 instantiateViewControllerWithIdentifier)到我正在重用的表视图。 似乎如果我重用它,情节提要正在创建我的 tableview 的 2 个实例,而我使用 instantiateViewControllerWithIdentifier 获得的那个不是我想要的。

        我不确定这是否是正确的方法。但我认为许多其他人正在以某种方式这样做。使用情节提要中的自定义表格单元格,我怀疑很多人都想重用他们的视图。

        【讨论】:

          【解决方案6】:

          例如:我们想在storyboard中重用视图(包括子视图),如下图所示。

          目前我所知道的最佳解决方案是将视图相关代码剪切并粘贴到 New Single View 文件中,而不会丢失信息。

          详细步骤如下

          第 1 步:重命名我们想要重用的视图。只需为第 2 步做准备。

          第 2 步:将故事板作为源代码打开,以便剪辑我们需要的 XML 代码

          第3、4步:搜索并剪辑我们需要的代码

          步骤 4.5(不需要):作为 Interface Builder 打开以查看已删除的视图

          第5、6步:新建XXX.xib并粘贴我们刚才截取的代码

          第 7 步:重要。将 code<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> 插入到 XXX.xib 源代码中。 警告:在将其作为 Interface Builder 打开之前执行此操作!否则,您将看到错误的尺寸和布局警告。

          [![步骤 7][9]][9]

          第 8 步:新建 XXX.swift 以连接 XXX.xib

          [![步骤 8][10]][10]

          第 9 步:在任何我们想要的地方添加视图

          [![步骤 9][11]][11]

          我收到警告:“您需要至少 10 个声望才能发布超过 8 个链接。” 你能支持我上传剩下的3张截图吗?

          【讨论】:

          • 请写下你的问题。否则你找不到我认为的任何解决方案。
          猜你喜欢
          • 2013-06-28
          • 1970-01-01
          • 2020-04-17
          • 2013-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-18
          相关资源
          最近更新 更多