问题标签 [nsapplication-delegate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
209 浏览

macos - Mac 启动守护程序运行时在重新启动期间启动时从不调用应用程序委托

我正在开发作为启动守护进程管理的 Mac OS X 服务。它没有任何 GUI,但它的结构是一个使用 NSApplicationMain 运行的 Cocoa 应用程序。

似乎即使没有 GUI,也存在问题 - 在终端窗口中通过 launchctl 启动时一切正常,但是在启动进程时系统重新启动时,我确定一旦调用 NSApplicationMain() 进程就会得到卡住。应用程序委托方法 applicationDidFinishLaunching: 永远不会被调用(这是我们初始化服务的地方)。也没有记录错误并且 NSApplicationMain() 不返回。

我已经梳理了启动服务文档,但我没有看到任何提及这个问题,也没有发现任何信息表明非 GUI NSApplication 运行时需要存在登录或窗口服务器。

任何人都有这方面的经验,知道一个常见的问题或有一个明确的答案是否有可能在启动时启动一个非 GUI NSApplication-based launchd 服务?

0 投票
2 回答
495 浏览

macos - 为什么在应用程序已经运行时不调用 application:openFile: ?

当用户双击由我的应用程序创建的文件或将此类文件拖到停靠图标上时,我想处理打开事件。

因此,我实现了NSApplicationDelegate'sapplication:openFile:application:openFiles:方法,它们在应用程序未运行时按预期工作。

但是,如果在打开事件发生时应用程序已经在运行,则应用程序将获得焦点,但上述方法永远不会被调用(其中的断点不会被命中)并且文件不会打开。

我也尝试实施application:openURLs:. 此方法具有相同的行为:如果在事件发生时应用程序已经在运行,则不会调用它。

当应用程序已经在运行时,我是否需要实现不同的函数来处理打开的文件,或者我需要做/设置其他事情以便在这些情况下调用现有函数?

0 投票
0 回答
243 浏览

swift - 主窗口并不总是在 applicationDidFinishLaunching 中初始化

我在应用程序委托中为我的应用程序的主窗口设置了背景图像:

但是,偶尔我会看到mainWindow返回nil. 所以我想applicationDidFinishLaunching这不是放置我的代码的最佳位置。有时我注意到在应用程序午餐期间,默认背景会在眨眼间出现,然后应用背景图像。

将我的代码用于应用背景图像的最佳位置在哪里?

0 投票
1 回答
85 浏览

macos - 启动时,阻止基于文档的应用重新打开退出时打开的未保存-未编辑-空文档

在一个简单的 rtf 编辑器(基于 NSDocument 子类)中,当应用程序启动时,它会创建一个无标题文件。这是一个理想的行为。但是,如果我用这个打开的、未编辑的和未保存的文档(空!)退出应用程序,应用程序将在下次启动时恢复此文档。

如何设置此文档以使其无法恢复。如果我在 IB 中取消选中窗口的控制器窗口“可恢复”属性,则不会恢复任何文档,这不是理想的行为:需要恢复用户未关闭的已编辑保存的文档;untitled-unedited 文件不应该!

0 投票
1 回答
244 浏览

swift - 获取在 ViewController 类中启动应用程序的文件名?

我实现了获取双击以启动我的 macOS 应用程序(Swift 4.x)的文件名称的NSApplicationDelegate方法。func application(_ sender: NSApplication, openFile filename: String) -> Bool但是,似乎在调用此方法之后ViewController viewDidLoad(),我的所有初始化代码都发生了。有没有办法在viewDidLoad()类中获取文件名,ViewController以便我可以直接在初始化代码中使用文件名?

更新:

我现在可以根据此链接对 Swift 4.2 的建议将数据从 传递AppDelegate到:ViewController

https://stackoverflow.com/questions/15049924/passing-data-from-app-delegate-to-view-controllerhttps://stackoverflow.com/questions/15049924/passing-data-from-app-delegate-to-视图控制器

所以我的问题仍然是如何直接获取文件名,ViewDidLoad()或者能够通过获取名称application(_, sender: NSApplication, openFile filename: String) -> Bool并将其传递给ViewController何时ViewDidLoad()被调用。

0 投票
1 回答
475 浏览

macos - macOS:有什么方法可以知道用户何时尝试通过其 Dock 图标退出应用程序?

Cocoa 应用程序有什么方法可以检测用户何时尝试通过其 Dock 菜单退出它,而不是通过其他方法?

applicationShouldTerminate:通常可以使用应用程序委托的方法来捕获和响应退出事件。但是,此方法似乎无法区分来自应用程序主菜单、其 Dock 图标、Apple 事件或任何其他常规退出应用程序方法的退出请求。我很好奇是否有任何方法可以准确地知道用户是如何尝试退出应用程序的。

0 投票
1 回答
1009 浏览

macos - 使用 NSWorkspace 打开应用程序之间的 URL 时如何发送和接收 NSAppleEventDescriptor?

NSWorkspace 有方法open(_:withAppBundleIdentifier: [...] )

从一组 URL 打开一个或多个文件。


您要打开的应用程序的 NSApplicationDelegate具有相应的方法,这些方法会被调用以打开您提供的 URL:


回到open(_:withAppBundleIdentifier: [...]),该方法有一个 NSAppleEventDescriptor 参数:

additionalEventParamDescriptor descriptor: NSAppleEventDescriptor?
在 AppleEvent 样式描述符中指定的附加选项。例如,您可以使用此参数指定在启动应用程序时要打开的其他文档。


我想向将打开文件的应用程序发送其他信息。

这将与userInfo通知中的字典类似地使用。

我已经构建了一个NSAppleEventDescriptor对象来表示这些信息。open( ... )我可以在 NSWorkspace函数中设置这个事件描述符。

但是如何在目标应用程序的应用程序委托中接收此事件描述符?

这些application(_: openFile:)函数没有事件描述符的参数或任何其他“ userInfo”类型的附加信息。


代码

根据答案和其他问题,我确定了以下解决方案。我现在得到了 Apple 事件的触发处理程序。但是我在 NSWorkspace 函数上设置的 Apple 事件不是处理程序中收到的事件!我如何获得我的Apple Event?


发送

发送苹果事件:

<NSAppleEventDescriptor: 'aevt'\'odoc'{ '----':'utxt'("THIS IS A TEST") }>


收到

收到苹果事件:

<NSAppleEventDescriptor: 'aevt'\'odoc'{ '----':[ 'bmrk'(888/$626F6F6B7803000000000 [....] 00000AC01000000000000...$) ] }>

0 投票
1 回答
164 浏览

cocoa - 在应用程序终止/窗口关闭之前对 NSDocument 进行最后一次更改?

我有一个基本的基于 NSDocument 的应用程序。在以下情况下,我需要对文档进行最后一次更改:

  1. 用户关闭文档的窗口
  2. 用户终止应用程序

为什么?

文档窗口包含一个 NSTextField。通常,在用户按下 Enter(通过 )后,输入到此文本字段中的文本将提交给文档的模型textDidEndEditing(_:)

假设用户输入了一些文本,但没有按 Enter。相反,他按下 Cmd-W 或 Cmd-Q 来关闭文档窗口或完全终止应用程序。

textDidEndEditing没有被调用,所以我检查文本字段是否包含更改并尝试自己更新文档。

❌ 这就是棘手的地方。以下结果导致死锁NSDocument.performActivityWithSynchonousWaiting

我设法通过不挂入viewWillDisappear,而是挂入NSDocument.canClose(withDelegate delegate: Any, shouldClose shouldCloseSelector: Selector?, contextInfo: UnsafeMutableRawPointer?).

✅ 此代码会在用户关闭文档窗口时保存更改:

.

❓不幸的是,当用户终止应用程序时,不会调用上述内容。我尝试更新我的文档applicationWillTerminate()——没有用。我还尝试覆盖applicationShouldTerminate()和延迟终止 3 秒。我可以看到文档的窗口被标记为“已编辑”,但没有保存更改。

如何在应用程序终止之前对 NSDocument 进行最后一次更改并自动保存?

0 投票
1 回答
514 浏览

objective-c - applicationWillTerminate 和 applicationShouldTerminate 不在 macOS 上运行?

我想在应用程序终止时做一些事情,所以我向我的 AppDelegate 添加了方法applicationShouldTerminate:applicationWillTerminate但是,当我从 XCode 运行我的应用程序然后按⌘Q时,不会调用任何方法。

现在我正在通过 logging 和 calls 进行测试,printf当我退出我的应用程序时,我在任何地方都看不到任何输出。该文档似乎表明这应该有效。谷歌没有产生任何有用的东西,在 GitHub 上搜索示例代码大多会返回观察其他应用程序被终止的应用程序。

为什么不applicationShouldTerminate:applicationWillTerminate被叫?

这是我的应用程序委托中的那些方法实现:

(我还通过在 Xcode 中创建一个全新的项目进行了测试,您可以在https://github.com/noahlt/TestTerminator找到该项目)。