将另一个 nib 加载到 viewController

Posted

技术标签:

【中文标题】将另一个 nib 加载到 viewController【英文标题】:loading another nib into a viewController 【发布时间】:2012-07-02 22:08:47 【问题描述】:

我有一个包含自己的 .nib 文件的 ViewController,我想将另一个 .nib 加载到这个 ViewController 中,这将是一个菜单......但是我只是不确定如何做到这一点,并希望一些帮助。

在向您展示代码之前,我将解释我所做的工作。

我有一个带有 Nib 的 UIViewController,它是我的主视图。 我创建了另一个 nib,它将作为一个菜单显示为主视图的子视图 我已将此 nibs 类更改为主视图的 UIViewController,以便它可以看到所有相同的 IBAction 和插座。

然后我运行下面的代码尝试将单独的笔尖加载为子视图,但是当我运行它时,另一个笔尖的子视图没有显示出来......

    jumpBarPortraitNib = [[UIView alloc] initWithFrame:CGRectMake(0.0, 50.0, 320.0, 367.0)];



    // add jumpbar container to view
    [self.view insertSubview:jumpBarPortraitNib belowSubview:actionTabBar];

【问题讨论】:

【参考方案1】:

这里显然有些混乱。

nib 只是一个包含 (*) 对象的存档,包括(通常)一个或多个视图对象(在您的情况下为 UIView)。您不会“将笔尖加载为子视图”。您实例化 nib,可能会将其交给 UIViewController 来拥有和管理它,并将 nib 中引用的视图添加到您的视图层次结构中。

您对第一行代码所做的就是创建一个具有给定帧大小的通用 UIView 实例,并将其插入到任何 [self view] 中。在您所写的内容中没有实际上引用了 nib,即使您将视图错误地命名为 nib。

对于你正在做的事情,我可能会选择两条路线之一:

    将视图作为单独的***视图添加到原始 nib 中,并将其连接到 IBOutlet。然后,您可以在您设置为 nib 的文件所有者的公共 UIViewController 实例中轻松显示菜单。 有一个单独的UIViewController 实例,它只管理菜单视图,您将使用它来使用@Aaron 提到的-initWithNibName: 实例化笔尖的内容。 (请注意,您不需要在外部设置框架;框架将作为视图的属性存档在 nib 中。)

*:不是真的,但你可以这样想。

【讨论】:

好吧,从你所说的来看,我正在努力实现你在选项 1 中概述的内容。我已经设置了一个 IBOutlet UIView 并右键单击拖动到菜单视图(在界面生成器中)但它没有显示该代码..你认为我错过了什么? 好答案。如果您刚刚开始使用这种类型的编程,您应该阅读this article,它在我开始时帮助我了解了很多基本概念。 @HurkNburkS 好的,假设您将您的财产/出口命名为“menuView”。然后你可以做一些简单的事情,比如[[self view] addSubview:[self menuView]] 刚刚实现 在原始 nib 中将视图添加为单独的***视图, 所以我现在正在使用我在另一个 nib 中完成的 IB 内容并添加它到 mainViewController nib.. 会看到它是怎么回事。 @HurkNburkS 好吧,不要将插座称为笔尖(因为它不是),并使用类似 @synthesize menuView = _menuView 的东西 - 并确保使用访问器方法 [self menuView] 而不是直接访问。【参考方案2】:

你需要使用initWithNibName,然后在下面一行设置frame:

UIViewController * jumpVC = [[UIViewController alloc] initWithNibName:@"jumpBarPortrait" bundle:nil];
jumpVC.view.frame = //your frame

【讨论】:

或者,如果您将UIViewController 子类化,则将其替换为您的自定义类(如MyAwesomeViewController)。 但是另一个笔尖没有 UIViewController....这是我有点困惑... @HurkNburkS 您可以选择创建另一个 UIViewController 子类来管理您的菜单。这以模块化的形式具有一些理论上的优势。请看我的回复。 每个视图都有一个视图控制器。当你按下按钮等时,这就是你告诉它做什么的方式。

以上是关于将另一个 nib 加载到 viewController的主要内容,如果未能解决你的问题,请参考以下文章

为 StoryBoard 中 ViewController 中使用的 UIView 加载 Nib

UITextField floatValue 加载 Nib

整理ViewController的生命周期和加载过程

从框架加载 nib 文件

尝试使用 .nib 加载视图控制器失败

将视图从 XIB 加载到 ViewController 和 VIewCell