界面生成器:如何加载 nib 文件

Posted

技术标签:

【中文标题】界面生成器:如何加载 nib 文件【英文标题】:Interface builder: how to load a nib file 【发布时间】:2013-12-09 08:25:31 【问题描述】:

我正在做一个项目,我创建了一个.xib 文件并希望加载在 xib 文件中创建的窗口。

我尝试了以下代码,但无济于事:

- (id) initWithWindowNibName: (NSString *) windowNibName

    self = [ super initWithWindowNibName: windowNibName];
    if ( self != nil )
    
        [ self window ];

    
    return self;

我正在调用initWithWindowNibName 方法,希望它能加载与当前控制器关联的窗口。基本上,我是在黑暗中扔飞镖!

实际上,我几乎不知道如何将创建的 nib 与控制器关联起来,以便上面的代码实际加载窗口。我已经能够关联各种IBOutletsIBActions,但无法加载窗口。

我是走错了路还是有特定的方法调用来加载窗口?

编辑[super initWithWindowNibName: windowNibName] 调用是到 NSWindowController,这是这个控制器类的超类。

【问题讨论】:

是什么让您相信您提供的代码不起作用? [self window] 返回什么? @PeterHosey 它返回一个NSWindow。但是,正如我在下面的答案中所问的那样,我是否需要将文件添加到项目设置的 Build Phases 部分中的 Copy Bundle Resources 中? 你是告诉我返回类型,还是没有返回nil?因为后者才是最重要的。 【参考方案1】:

你称它为:

self.myWindowController = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"];

然后你需要显示窗口:

[self.myWindowController showWindow:self]; //self or nil

或者,如果您想将其加载为工作表:

[NSApp beginSheet: [self.myWindowController window]
   modalForWindow: self.window
    modalDelegate: self
   didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
      contextInfo: nil];

编辑:

- (id)initWithWindow:(NSWindow *)window

    self = [super initWithWindow:window];
    if (self) 
        ...//other initiliasation codes here
    

    return self;

【讨论】:

在你的第一个代码 sn-p 中,我想你的意思是 [[NSWindowController alloc] initWithWindowNibName:...] @NSBum 是的,他只是那个意思。 @Anoop Vaidya, @NSBum 无法获得窗口的原因是initWithWindowNibName 需要.nib 文件的名称,而我有一个.xib 文件吗? Nib 和 xib 不一样。 @Sankalp:您的 .xib 是源代码(在某种意义上); Xcode 从中生成一个 .nib。 nib 是您的应用将加载的内容。 @AnoopVaidya 我是否需要将文件添加到 Xcode 项目设置的 Build Phases 部分中的 Copy Bundle Resources 中?【参考方案2】:

我是否需要将文件添加到 Xcode 项目设置的 Build Phases 部分的 Copy Bundle Resources 中?

如果“文件”是指笔尖,那么是的。

您需要将其添加到 Copy Bundle Resources 阶段,以便将编译后的 nib 放入您的 bundle 的 Resources 文件夹中。否则,Xcode 将不会编译您的 xib,也不会将它的一个 nib 放在您包的 Resources 文件夹中。

如果您的 nib 不在捆绑包的 Resources 文件夹中,那么您将无法从中加载任何内容。

将 nib 添加到 Copy Bundle Resources 阶段的最简单方法是在 Project Navigator 中选择 nib,打开 File Inspector,然后选中要在其中使用 nib 的目标框。

当您创建一个新的 nib(或包含 nib 的窗口控制器或视图控制器)时,Xcode 会提示您输入此信息。最后的步骤之一是选择将其添加到哪些目标。每当您创建新笔尖(直接或作为副作用)时,请务必查看该列表并确保选中了正确的复选框。

【讨论】:

以上是关于界面生成器:如何加载 nib 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 NIB 加载 UIView - 帧大小错误

界面生成器:从 NIB 调整视图大小

如何使用界面生成器动态更改视图控制器的类

在界面构建器中设计的自定义视图未显示

iOS:如何获取刚刚在界面生成器中设置的 UIView 的框架

“扁平化编译的xib文件”项目构建选项“做啥”