如何在Xcode 4中将.xib文件与类文件链接

29

我在Xcode4下启动了一个通用项目,我的应用程序可以在iPhone和iPad设备上运行,但是对于iPad来说设计不够好。MainWindow有两个.xib文件:MainWindow.xib(iPhone设备)和MainWindow-iPad.xib(iPad设备)。但是MainView只有一个.xib文件:MainView.xib。

因此,我正在尝试为iPad设备创建一个特定的.xib文件:

新建文件 > 用户界面 > 视图 -> 下一步 -> 设备系列: iPad -> MainView-iPad.xib -> 保存

当然,这里没有连接任何内容,也没有引用outlet或链接到任何类。

我检查了我的新MainView-iPad.xib的每个缩略图,以将其与我的MainViewController类链接起来,但未成功!?

我应该在哪里或如何将其链接到我的MainViewController类呢? 谢谢。

4个回答

93

用户user763308给出了正确的答案:

在Xcode4中将.xib文件链接到类的方法如下:

  1. 打开你的.xib文件。
  2. 在“占位符”中选择“File's Owner”。
  3. 在右侧面板的第三个缩略图“Identity Inspector”中,编辑“Custom Class”字段并输入你类的名称。

我还需要进行以下操作:

  1. 在“对象”下点击根视图。
  2. 单击最后一个选项卡:“显示连接”。
  3. 将“新引用输出”拖动到“File's Owner”,并选择“view”。

3
这似乎正是你需要做的事情,我之前曾尝试过并且奏效了,但当你尝试将一个 .xib 文件加入项目中时,有时候仍然会出现 .h/.m 类文件无法连接到 .xib 文件的情况,我现在也束手无策。 - RanLearns
它没有自动更正到我需要在第三步添加的类。尝试清理构建。 - tech savvy
“点击对象下的根视图”是什么意思? - noelicus
好的 - 我现在知道了。你的意思是点击左侧的“视图”方块,它位于“文件所有者”的图标/框和“第一响应者”框/图标下面。然后点击右侧停靠区中名为“显示连接检查器”的最后一个选项卡。谢谢 - 对我没用 :( ... 但是下面Tom的回答足够了! - noelicus

3

您想创建一个新的UIViewController子类,而不是一个新的UI文件。这将创建您的.xib文件以及类文件(.m和.h)。该模板位于Cocoa Touch下。

想要链接到现有的视图控制器可能不是一个好主意。如果您正在遵循MVC(Model-View-Controller)设计模式,则将数据类和视图控制器分开。如果可以的话,请将MainViewController类中的内容移出并放到它所拥有的数据类中。然后创建另一个视图控制器用于iPad,并使其拥有您创建的数据类的实例。


谢谢您的回复。我当然在尝试遵循MVC模型,但对我来说(也许我完全错了),.xib文件代表MVC模型中的“视图”。我认为一个控制器有两个视图并没有什么问题。如果我必须为每个视图创建一个控制器,那么每次我在一个控制器中进行更改时,我都必须在另一个控制器中进行复制吗?无论如何,在Xcode4下将.xib链接到类的方法如下: *打开您的.xib *在占位符中:选择文件所有者 *在右侧面板的第三个缩略图:“身份检查器” -自定义类部分:选择类文件 - user763308
我相信通常每个UIViewController子类都会创建一个.xib。以下是苹果文档链接:https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW35 - Tom Hamming

1

在通用应用程序的情况下,.xib文件与控制器类的比例为2:1并不一定是错误的。这是我遵循的模式:

您有您的MainViewController类。您有2个.xib文件:MainView-iPhone.xib和MainView-iPad.xib。这两个文件都将它们的“File's Owner”插座设置为MainViewController。现在,为了确保视图控制器实际上加载正确的界面并连接所有正确的插座,具体取决于应用程序运行的设备,我会执行以下操作:

MainViewController* controller = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    controller = [[MainViewController alloc]initWithNibName:@"MainView-iPad" bundle:[NSBundle mainBundle]];
} else {
    controller = [[MainViewController alloc] initWithNibName:@"MainView-iPhone" bundle:[NSBundle mainBundle]];
}
/* Present the controller */

现在,我也应该说一下,如果在不同的设备上运行时需要遵循太多不同的代码路径,那么这只是一个好主意。如果控制器在iPad和iPhone上运行时的行为更加专业化,那么最好的主意是将公共行为抽象到MainViewController中,然后编写两个子类:MainViewController_iPhone和MainViewController_iPad。每个子类加载相应的.xib文件并在内部处理所有具体细节。在这种情况下,上面的代码看起来更像:

MainViewController* controller = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    controller = [[MainViewController_iPad alloc] init];
} else {
    controller = [[MainViewController_iPhone alloc] init];
}
/* Present the controller */

1

要将.xib文件与类文件链接,您可以执行以下步骤:

1)转到右侧视图。 2)单击第三个按钮,其中有一行询问自定义类der,您只需编写要链接的类文件的名称。

用于创建引用输出:

1)您可以从iPhone .xib中复制所有输出并将其粘贴到此处,然后将所有输出拖动到文件所有者,然后将它们连接起来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接