2

我正在开发一个简单的 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) 打印对象 0x450d50 (gdb)

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

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

不过,我仍然缺少一些东西,因为我当然应该能够通过从主窗口换出 NIB 文件名来启动 UIViewController 的任意子类?

EDIT2:(对凯文的回应)这不是我所说的关于 XIB 的内容。

我有 3 个 XIB:

主窗口人员列表视图人员详细信息视图

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

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

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

EDIT4: (to lostintransit) PersonListViewController 有适当的 - (IBAction) viewDetail; 方法。问题是我在 MainWindow.xib 中找不到将 UINavigationController 中的视图标记为“最初从 PersonListView.xib 加载此视图,以 PersonListViewController 作为视图”的方法将 PersonListView 替换为 PersonDetailView。

4

4 回答 4

4

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

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

仅创建任何视图控制器的实例然后加载您的自定义 NIB(这是您定义的选项卡栏现在正在执行的操作)是不够的,因为您的自定义视图中的连线将没有任何附加内容。

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

于 2009-01-05T06:27:20.673 回答
0

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

于 2009-01-05T02:05:46.647 回答
0

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

-(IBAction) 方法名;

于 2009-01-05T08:27:20.713 回答
0

我也犯了同样的错误。

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

转到 PersonListViewController.m 的信息,选择目标部分并确保选中您的应用程序的目标。

于 2010-07-17T07:23:03.650 回答