【问题标题】:Custom views with Storyboard使用 Storyboard 自定义视图
【发布时间】:2012-03-18 20:57:39
【问题描述】:

在复杂的屏幕(视图控制器)中,我曾经将整个事物分成更小的部分(我称它们为小部件)。这些小部件基本上由MyWidget.hMyWidget.m 文件以及MyWidget.xib 文件组成,其中根元素是UIView,MyWidget 类是UIView 的文件所有者。在这个小部件的初始化中,我做了一个loadNibNamed

然后在我的视图控制器中执行[[MyWidget alloc] init],我将它作为子视图添加到视图的控制器主视图中。到目前为止,这非常有效。

我现在想知道,如何对故事板做同样的事情,因为我不能真正开始在某个地方拖入 UIView,我总是必须从 UIViewController 开始,我不想这样做。

如果无法使用 Storyboard 执行此操作,我是否可以简单地使用旧方法,将 Storyboard 用于我的主屏幕和转场,并使用单独的 .xib 文件来定义自定义视图?

【问题讨论】:

  • 您是否希望为您的视图控制器单独创建xibs,而不是在情节提要中?
  • 您找到解决方案了吗?
  • @aryaxt:我正在使用 Storyboard 和 xib 的混合物。主屏幕和 xib 的情节提要,只有 UIView 作为复杂视图或小部件的根。所以并不是我最初的问题的真正答案(通过使用故事板),但基本上做了我以前做过的事情。
  • 这些天,只使用容器视图,真的就这么简单..stackoverflow.com/questions/23399061/…

标签: ios storyboard xib


【解决方案1】:

将小部件/视图放在单独的 .xib 文件中是可行的,尤其是当您可能希望从多个视图控制器中引用同一个视图时。

但是,有时您确实希望在同一个故事板中看到其他视图/小部件,这是可能的。以下是你的做法:

  1. 在 IB 中选择你的视图控制器(点击视图下方的黑条),然后将一个 UIView 从 Object Library 拖到黑条中:

  2. 当视图位于黑条中时,它会像 IB 中的任何其他视图一样被实例化,但不会添加到您的视图层次结构中,直到您在代码中这样做。如有必要,更改视图的类以匹配您自己的子类:

  3. 您可以像连接任何其他视图一样将其连接到您的视图控制器:

  4. 添加的视图会显示在您的文档大纲中,您也可以在其中关联操作和引用:


现在,剩下的问题是,无论您尝试单击或双击多少次,您都无法真正看到视图,这将破坏将其放在同一个故事板中的整个目的。幸运的是,我知道有两种解决方法。

第一个解决方法是将视图从黑条拖回视图控制器的视图,对其进行编辑,然后在完成后将其拖回黑条。这虽然麻烦但可靠。

另一种解决方法更挑剔,但我更喜欢它,因为它可以让我同时查看所有视图:

  1. 将 UITableView 从 Object Library 拖到新添加的视图中。

  2. 然后将一个 UITableViewCell 拖到那个 UITableView 中。

  3. 一旦你这样做了,你的视图会神奇地从旁边弹出,但是你有一个你不想要的 UITableView。您可以将其调整为 0x0,也可以将其删除,并且您的 UIView 将(通常)仍然可见。

  4. 有时辅助视图会在 IB 中再次隐藏。如果删除了 UITableView 可以重复上述步骤,或者如果 UITableView 仍在层次结构中,则只需单击 UITableViewCell 即可再次出现视图。

第二种方法适用于 UIViews 但不适用于 UIToolbars 并且对于 UIButtons 是不可能的,因此当您需要包含许多不同的子视图时,我发现的最简洁的解决方案是将单个辅助 UIView 附加到您的视图控制器一个永远不会显示的容器,将所有辅助视图放在那里,并使用 UITableViewCell 技巧使所有内容可见。我将我的虚拟 UITableView 调整为 0x0 以使其不可见。以下是所有内容的屏幕截图:

【讨论】:

  • 2013 年 3 月,我不需要这样做 - 您应该完全忽略黑条,并将您的视图直接拖放到主视图中,它工作正常(Xcode 4.5+)
  • 是否可以在同一个 ViewController 上重用该自定义 uivew - 如果我前。需要两个自定义 uivews - 如果是这样的话?
  • 当,我更喜欢只创建一个单独的 xib。当我必须在 6 个月内更新应用程序时,我可能不会记得这一切。
  • 虽然这是一个很棒的答案,但我偶然发现了另一种我认为更好的方法。将插座连接到实际视图组件时。如果您将鼠标悬停在此类内部视图的某个组件上 - 它会弹出以便于选择。然后你会在故事板上看到它...
  • 虽然这是一个令人难以置信的令人钦佩的历史答案,但实际上它现在已经完全过时了。苹果通过引入“容器视图”解决了整个问题,这现在是你在制作应用程序时所做的核心、基本的事情——一切都是“容器视图”。谢天谢地,现在很容易!
【解决方案2】:

如果您只是想在其他地方(而不是在故事板中)制作视图控制器,那么有一种非常简单的方法可以完成此操作:

1) 像往常一样使用他们各自的xibs 创建您的CustomViewControllers(在我尝试过的代码中为abcdController)。

2) 将UIViewController(或CustomViewController 的超类)添加到情节提要。

3) 将 CustomClass 设置为 CustomViewController 而不是 UIViewController,如下所示:

4) 最后,在您的viewDidLoad 中,加载自定义xib,您就完成了。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

【讨论】:

  • 感谢您非常详细的回答,但我实际上不是在寻找自定义视图控制器,而是在添加到标准 UIViewController 中的自定义视图(小部件)。所以视图控制器不是问题,但我想知道创建自定义小部件的最佳方法是什么。要么 A)像以前一样使用 .xib 文件,要么 B)其他一些我还不知道的方法 :-)
  • 嗯...我想我得到了你想要的。基本上你想用同一个控制器处理多个视图,对吧?在那种情况下,我想不出除了loadNibNamed之外的其他方法...... XO
  • 这为我解决了这个问题:stackoverflow.com/questions/11047991/… 但是,我使用 loadView 而不是 viewDidLoad...
  • 重复一遍,这一切(谢天谢地!)现在容器视图已经过时了。只需单击一个容器视图即可完成
【解决方案3】:

我认为您可以这样做以从 Storyboard 中获取特定视图控制器的实例并在其上使用视图。

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

希望对你有帮助

谢谢 维杰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2013-07-12
    • 1970-01-01
    • 2012-03-03
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多