Interface Builder - UIViewController子类未被识别为子类

时间:2009-01-05 01:43:02

标签: iphone interface-builder

我正在开发一款简单的iPhone应用程序。

我有1个UINavigationController和2个UIViewController的子类。

我有一个MainWindow.xib文件,一个PersonListView.xib和一个PersonDetailView.xib。

MainWindow.xib具有UINavigationController,其视图链接到PersonListView.xib文件。

PersonListView.xib将文件所有者列为PersonListViewController类。

我在PersonListView上有一些按钮,以及标签和图像。全部显示正确。

当我尝试将PersonListView上的按钮链接到我的PersonListViewController类时,按钮没有触发....

结果:   *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [UIViewController viewDetail]:无法识别的选择器发送到实例0x450d50'

如果我进入调试控制台和打印对象0x450d50,我得到:

(gdb)print-object 0x450d50 (gdb)

Interface Builder正确地将文件所有者显示为PersonListViewController,那么为什么我的按钮操作(链接到文件所有者)会以某种方式进入超类?

EDIT1:好的,似乎正在发生的事情是我没有得到子类的实例,除非在我的MainWindow.xib中,我明确地将视图控制器的类设置为我的子类。

但是,我仍然缺少一些东西,因为我只能通过从主窗口中交换出NIB文件名来启动UIViewController的任意子类吗?

EDIT2 :(对Kevin的回应) 对于XIB的内容,这不是我所说的。

我有3个XIB:

主窗口 PeopleListView PeopleDetailView

PeopleListView和PeopleDetailView每个都有一个关联的文件所有者,它是一个相应的UIViewController子类。显然,当我从一个页面移动到另一个页面时,我需要将我的事件转到正确的控制器类...但是如果我只能使用默认的UIViewController或一个子类,那将会更加困难吗?

通过手动设置具有正确root的UINavigationController,我可以在代码中获得正确的效果,但我觉得应该有更好的方法通过InterfaceBuilder。

EDIT3 :(对肯德尔) 我没有使用标签栏。但是,模型是相同的,我的导航控制器中的视图必须连接到一个子类,这似乎有点icky。

EDIT4 :(对lostintransit) PersonListViewController具有相应的 - (IBAction)viewDetail;方法。问题是我无法在我的MainWindow.xib中找到一种方法来将我的UINavigationController中的视图标记为“最初从PersonListView.xib加载它,并使用PersonListViewController作为视图”,这样就不会让用PersonDetailView替换PersonListView。

4 个答案:

答案 0 :(得分:4)

我认为你正在使用标签栏,对吗?

如果是这样,请这样考虑一下。必须将MainWindow xib中定义的每个选项卡定义为自定义视图控制器类型,因为这是选项卡栏在加载时将创建的类型。标签栏为加载时定义的每个标签创建视图控制器。

仅仅创建任何视图控制器的实例,然后加载自定义NIB(这是您定义的标签栏现在正在执行的操作)是不够的,因为自定义视图中的连接无需附加任何内容

因此,确保在MainWindow.xib中的每个选项卡下定义的每个视图控制器(使用IB中的树视图来检查这一点)除了指向您的自定义XIB之外,还要设置为正确的自定义UIViewController类型。文件的所有者设置为正确的类型(尽管只有在基本视图之外的文件所有者连接任何内容时才重要)。

答案 1 :(得分:0)

更改xib的名称对该xib的内容完全没有影响。如果要更改正在使用的子类,则更改“信息”面板中的类名。

答案 2 :(得分:0)

从例外看来,绑定没有正确完成。方法签名似乎没有正确的判断异常。按钮操作是否链接到返回类型为IBAction的方法?该方法的签名应为

- (IBAction)methodName;

答案 3 :(得分:0)

我犯了同样的错误。

问题是,你没有设置PersonListViewController.m的目标。

转到PersonListViewController.m的信息,选择目标部分并确保检查应用的目标。