App Delegate 和 Application 的正确连接是什么

What are the correct connections for App Delegate and Application

未经通知,下图中的 2 个通知是在搜索为什么 -applicationShouldTerminate: 在 AppDelegate.m 退出时未被调用时发现的 (Cmd+Q)。前段时间有用。

将鼠标悬停在两个黄色三角形上显示:

  1. NSObject 没有名为 delegate 的出口。
  2. 未在 'NSObject' 上定义操作 'terminate:'。

Xcode 未显示错误或警告并且应用程序已构建。

当单击 window 的红点时,

-applicationShouldTerminateAfterLastWindowClosed: 在 AppDelegate.m 内被调用。

我对Cocoa的体验很薄(学习)。我比较了 File's Owner、Application 和 App Delegate 在其他 2 个项目中的连接,并认为缺少 window 插座可能是原因。上面的通知指向别的东西。

我想首先确保连接正确。我该如何修复?

编辑: 添加主要图像 Window 控制器连接

编辑 2: 添加文件所有者连接的图像

在应用程序的主 NIB 中,文件所有者和应用程序这两个占位符最终都指向同一个对象。该对象是应用程序对象,NSApplication 的唯一实例或它的自定义子class。 Application 占位符始终占据应用程序对象的位置,因为这是它的用途。 File's Owner 占位符在 运行 时间加载时保留指定为 NIB 所有者的任何对象的位置。 Cocoa 在应用程序启动时加载主 NIB 时,它将应用程序对象指定为所有者。对于其他 NIB,文件所有者可能是其他对象。

但是,Interface Builder 不知道给定的 NIB 是主要的。因此,它独立对待这两个占位符。

我不知道为什么 Interface Builder 将应用程序占位符的 class 设置为 NSObject。真的应该是NSApplication。这就是为什么 Interface Builder 没有意识到应用程序对象有一个 delegate 出口和一个操作方法 -terminate:.

碰巧,文件所有者的 class 正确设置为 NSApplication

所以,有两种方法可以解决这个问题:

  1. 将应用程序占位符的 class 设置为 NSApplication 或者,在极少数情况下,您使用的是 subclass,即 subclass。
  2. 断开与应用程序占位符的连接,并将它们连接到文件所有者。这是标准项目模板执行此操作的方式。

对于任何给定的主要 NIB,您可能应该标准化使用一个或另一个而不是两者。也就是说,一个或另一个应该没有联系。这样您就可以避免冲突或冗余连接。