我正在开发一个简单的 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。