【问题标题】:InterfaceBuilder - UIViewController subclass not recognized as subclassInterfaceBuilder - UIViewController 子类未被识别为子类
【发布时间】:2009-01-05 01:43:02
【问题描述】:

我正在开发一个简单的 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 正确地将 File's Owner 显示为 PersonListViewController,那么为什么我的按钮操作(链接到 File's Owner)会以某种方式转到超类?

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

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

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

我有 3 个 XIB:

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

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

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

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

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

【问题讨论】:

    标签: iphone interface-builder


    【解决方案1】:

    我认为您使用的是标签栏,对吗?

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

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

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

    【讨论】:

    • 从您的跟进中,我更了解您在做什么,您必须定义导航控制器将出于相同原因创建的视图控制器类的实例 - 所以如果您更改 nib 名称,您必须制作确保类型匹配。
    • 这是确切的解决方案。通过确保 MainWindow.xib 指向正确的 UIViewController 类型的自定义类,我遇到了同样的问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      -(IBAction) 方法名;

      【讨论】:

        【解决方案4】:

        我也犯了同样的错误。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-20
          • 2018-02-28
          • 1970-01-01
          • 1970-01-01
          • 2017-01-19
          • 2017-09-20
          • 1970-01-01
          相关资源
          最近更新 更多