自定义视图与故事板

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

在我的View Controller中,我做了一个[[MyWidget alloc] init] ,我把它添加到View的Controller主视图中作为子视图。 到目前为止,这是完美的。

我现在想知道,如何做与故事板相同的,因为我不能真正开始在一个UIView地方,我总是不得不从UIViewController开始,我不想。

如果没有可能的方式与故事板做到这一点,我可以简单地做到这一点,通过使用我的主屏幕和赛格故事板,并使用单独的.xib文件来定义自定义视图?

把widget / view放到一个独立的.xib文件中,特别是如果你想从多个View Controller引用同一个视图的话。

但是,有时您想要在同一个故事板中看到额外的视图/小部件,这是可能的。 以下是你如何做到这一点:

  1. 在IB中select你的视图控制器(点击视图下面的黑色条),然后将UIView从对象库拖到黑色条中:

    在这里输入图像描述

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

    在这里输入图像描述

  3. 你可以把它连接到你的视图控制器,就像你连接任何其他视图一样: 在这里输入图像描述

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

    在这里输入图像描述


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

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

另一个解决方法是更挑剔,但我更喜欢它,因为它让我看到我所有的观点在同一时间:

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

    在这里输入图像描述

  3. 一旦你这样做了,你的视图在旁边神奇地popup,但你有一个你不想要的UITableView。 你可以调整它到0x0,或者你可以删除它,你的UIView将(通常)仍然保持可见。

  4. 偶尔次要视图将在IB中再次隐藏。 你可以重复上述步骤,如果你删除了UITableView,或者如果UITableView仍然在层次结构中,你只需要点击UITableViewCell,视图就会再次出现。

第二种方法适用于UIViews,但不适合UIToolbars,UIButtons是不可能的,所以当你需要包含许多不同的子视图时,我发现最干净的解决scheme是将一个辅助UIView作为一个容器附加到你的视图控制器上永远不会显示,将所有的次要视图放在那里,并使用UITableViewCell技巧使所有的东西都可见。 我调整我的虚拟UITableView到0x0,使其不可见。 下面是一个如何在一起的截图:

在这里输入图像描述

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

1)像往常一样创build你的CustomViewController (在我试过的代码中的abcdController )与他们各自的xib s。

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

我认为你可以做这样的事情来从Storyboard中获得特定的视图控制器的实例,并在其上使用视图。

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

希望这可以帮助

谢谢维杰