App Delegate和Application

时间:2015-10-04 22:43:20

标签: objective-c xcode cocoa nsapplication

未宣布,在搜索为什么在退出时(Cmd + Q)AppDelegate.m中没有调用-applicationShouldTerminate:时,会发现下图中的2个通知。它工作了一段时间。

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

  1. NSObject没有名为delegate的插座。
  2. 'NSObject'上未定义动作'terminate:'。
  3. Xcode没有显示错误或警告以及应用程序构建。

    当点击窗口的红点时,在AppDelegate.m中调用

    -applicationShouldTerminateAfterLastWindowClosed:

    MainWindow.nib view

    我对Cocoa的经验很薄(学习)。我在其他两个项目中比较了文件所有者,应用程序和应用代表的连接,并认为缺少窗口可能是原因。上面的通知指向别的东西。

    我想确保连接正确是第一步。我该如何修复?

    编辑:添加主窗口控制器连接的图像

    Main Window Controller info

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

    enter image description here

1 个答案:

答案 0 :(得分:1)

在应用程序的主要NIB中,两个占位符File的所有者和应用程序最终都引用了同一个对象。该对象是应用程序对象,NSApplication的唯一实例或其自定义子类。应用程序占位符始终保留应用程序对象的位置,因为它的目的。文件的所有者占位符在运行时加载任何对象被指定为NIB所有者的位置。当Cocoa在应用程序启动时加载主NIB时,它将应用程序对象指定为所有者。对于其他NIB,文件所有者可能是其他一些对象。

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

我不知道为什么Interface Builder将Application占位符的类设置为NSObject。它应该是NSApplication。这就是为什么Interface Builder没有意识到应用程序对象具有delegate插座和操作方法-terminate:的原因。

实际上,File的所有者类已正确设置为NSApplication

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

  1. 将应用程序占位符的类设置为NSApplication,或者在极少数情况下将您的子类设置为该子类。
  2. 断开与Application占位符的连接,并将它们连接到File的所有者。这是标准项目模板的工作方式。
  3. 对于任何给定的主要NIB,您应该标准化使用其中一个而不是两个。也就是说,一个或另一个应该没有连接。这样就可以避免冲突或冗余连接。