在复杂的屏幕(视图控制器)中,我曾经将整个事物分成更小的部分(我称它们为小部件)。这些小部件基本上由 MyWidget.h
和 MyWidget.m
文件以及 MyWidget.xib
文件组成,其中根元素是 UIView
,MyWidget 类是 UIView 的文件所有者。在这个小部件的初始化中,我做了一个 loadNibNamed
。
然后在我的 View Controller 中执行 [[MyWidget alloc] init]
,将其作为子视图添加到 View 的 Controller 主视图中。到目前为止,这完美无缺。
我现在想知道,如何对故事板做同样的事情,因为我不能真正开始在某个地方拖入 UIView
,我总是必须从 UIViewController
开始,我不想这样做。
如果无法使用 Storyboard 执行此操作,我是否可以简单地使用旧方法,将 Storyboard 用于我的主屏幕和转场,并使用单独的 .xib 文件来定义自定义视图?
xib
,而不是在情节提要中?
将小部件/视图放在单独的 .xib 文件中是可行的,特别是如果您可能想从多个视图控制器引用相同的视图。
但是,有时您确实希望在同一个故事板中看到其他视图/小部件,这是可能的。这是你如何做到的:
在 IB 中选择您的视图控制器(单击视图下方的黑条),然后将 UIView 从对象库中拖到黑条中:当视图在黑条中时,它会像 IB 中的任何其他视图一样被实例化,但只是直到您在代码中添加到您的视图层次结构中。如有必要,更改视图的类以匹配您自己的子类:您可以将其连接到您的视图控制器,就像您连接任何其他视图一样:添加的视图显示在您的文档大纲中,您也可以在那里连接操作和引用:
现在,仍然存在的问题是,无论您尝试单击或双击多少次,您都无法真正看到视图,这将破坏将其放在同一个故事板中的整个目的。幸运的是,我知道有两种解决方法。
第一个解决方法是将视图从黑条拖回视图控制器的视图,对其进行编辑,然后在完成后将其拖回黑条。这很麻烦但可靠。
另一种解决方法更挑剔,但我更喜欢它,因为它可以让我同时看到我的所有观点:
将 UITableView 从 Object Library 拖到新添加的视图中。然后将一个 UITableViewCell 拖到那个 UITableView 中。一旦你这样做了,你的视图就会神奇地从旁边弹出,但是你有一个你不想要的 UITableView。您可以将其调整为 0x0,也可以将其删除,并且您的 UIView 将(通常)仍然可见。有时,辅助视图会在 IB 中再次隐藏。如果您删除了 UITableView,您可以重复上述步骤,或者如果 UITableView 仍在层次结构中,您只需单击 UITableViewCell,视图将再次出现。
第二种方法适用于 UIViews 但不适用于 UIToolbars 并且对于 UIButtons 是不可能的,因此当您需要包含许多不同的子视图时,我发现的最干净的解决方案是将单个辅助 UIView 作为容器附加到您的视图控制器永远不会显示,将所有辅助视图放在那里,并使用 UITableViewCell 技巧使所有内容可见。我将我的虚拟 UITableView 调整为 0x0 以使其不可见。以下是所有内容的屏幕截图:
https://i.stack.imgur.com/ZgJPH.png
如果你只是想让你的视图控制器在其他地方(而不是在你的故事板中),那么有一个非常简单的方法来完成这个:
1) 像往常一样用他们各自的 xib
创建您的 CustomViewController
(在我尝试过的代码中)。
2) 将 UIViewController
(或 CustomViewController
的超类)添加到情节提要。
3) 将 CustomClass 设置为 CustomViewController
而不是 UIViewController
,如下所示:
https://i.stack.imgur.com/s79p3.png
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.
}
loadNibNamed
之外的其他方法...... XO
我认为你可以做这样的事情来从情节提要中获取特定视图控制器的实例并在其上使用视图。
ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.
希望这可以帮助
谢谢维杰