使用Storyboard自定义视图

时间:2012-02-29 11:12:34

标签: ios storyboard xib

在复杂的屏幕(视图控制器)中,我曾经把整个东西分成小块(我称之为小部件)。这些小部件基本上由MyWidget.hMyWidget.m文件以及MyWidget.xib文件组成,其中根元素是UIView,MyWidget类是文件所有者UIView。在这个小部件的init中,我做了loadNibNamed

在我的View Controller中,然后执行[[MyWidget alloc] init],我将其作为子视图添加到View的Controller主视图中。到目前为止,这完美无缺。

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

如果使用Storyboard无法做到这一点,我可以通过使用故事板进行主屏幕和segue,并使用单独的.xib文件来定义自定义视图,以旧方式进行操作吗?

3 个答案:

答案 0 :(得分:188)

将窗口小部件/视图放在单独的.xib文件中是有效的,尤其适用于您可能希望从多个视图控制器引用相同视图的情况。

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

  1. 在IB中选择您的视图控制器(单击视图下方的黑色条),然后将UIView从对象库拖到黑条中:

    enter image description here

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

    enter image description here

  3. 您可以将其连接到视图控制器,就像连接任何其他视图一样:enter image description here

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

    enter image description here


  5. 现在,剩下的问题是,无论您尝试单击或双击多少次,都无法实际看到视图,这会使将其置于同一个故事板中的全部目的失败。幸运的是,我知道有两种解决方法。

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

    其他解决方法更挑剔,但我更喜欢它,因为它可以让我同时看到我的所有观点:

    1. 将UITableView从对象库拖到新添加的视图中。
    2. 然后将UITableViewCell拖入该UITableView。

      enter image description here

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

    4. 偶尔会在IB中再次隐藏辅助视图。如果你删除了UITableView,你可以重复上述步骤,或者如果UITableView仍然在层次结构中,你只需要点击UITableViewCell,视图就会再次出现。
    5. 第二种方法适用于UIViews,但对UIToolbars不太好,对于UIButton是不可能的,所以当你需要包含许多不同的子视图时我发现的最干净的解决方案是将一个辅助UIView附加到你的视图控制器一个永远不会显示的容器,将所有辅助视图放在那里,并使用UITableViewCell技巧使所有内容都可见。我将我的虚拟UITableView调整为0x0以使其不可见。这是一个截然不同的截图:

      enter image description here

答案 1 :(得分:11)

如果你只是想让你的视图控制器在其他地方(而不是在你的故事板中),那么有一个非常简单的方法来实现这个目标:

1)像往常一样,使用各自的CustomViewController创建abcdController s(我尝试过的代码中xib)。

2)在故事板上添加UIViewController(或者CustomViewController的超类)。

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

enter image description here

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.
}

答案 2 :(得分:1)

我认为你可以做这样的事情来从Storyboard获取特定viewcontroller的实例并在其上使用视图。

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

希望这有帮助

由于 维杰