gpt4 book ai didi

objective-c - 应用程序委托(delegate)和应用程序的正确连接是什么

转载 作者:行者123 更新时间:2023-12-03 17:49:12 26 4
gpt4 key购买 nike

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

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

  1. NSObject 没有名为 delegate 的 socket 。
  2. “NSObject”上未定义操作“terminate:”。

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

-applicationShouldTerminateAfterLastWindowClosed: 当单击窗口的红点时,在 AppDelegate.m 中调用。

MainWindow.nib view

我对 Cocoa 的经验很薄弱(学习)。我比较了另外 2 个项目中文件所有者、应用程序和应用程序委托(delegate)的连接,并认为缺少窗口导出可能是原因。上面的通知指出了其他事情。

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

编辑:添加主窗口 Controller 连接的图像

Main Window Controller info

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

enter image description here

最佳答案

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

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

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

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

因此,有两种方法可以解决此问题:

  1. 将应用程序占位符的类设置为 NSApplication,或者在极少数情况下,您使用子类,设置该子类。
  2. 断开这些与应用程序占位符的连接,并将它们连接到文件所有者。标准项目模板就是这样做的。

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

关于objective-c - 应用程序委托(delegate)和应用程序的正确连接是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com