我们知道,在使用AppKit
的时候,我们通过NSApplicationDelegate
的几个open
方法来实现双击打开文件。
@MainActor optional func application(_ application: NSApplication, open urls: [URL])
@MainActor optional func application(_ sender: NSApplication, openFile filename: String) -> Bool
@MainActor optional func application(_ sender: NSApplication, openFiles filenames: [String])
但是在SwiftUI下,情况就有所不同了。我们这里所说的SwiftUI,指的是应用以SwiftUI的框架为主,而不是以AppKit为主,混合使用SwiftUI的情况。后者,和上面的情况没区别。
SwiftUI应用带来的变化
首先是,NSApplicationDelegate
的这三个方法都发生了改变,后两个方法直接不会被调用了。而第一个方法经常会返回一个空的数组。这让人非常疑惑。
经过查询,我知道,原来在SwiftUI下,SwiftUI的View本身可以处理一个打开的URL,而多余的,则需要用
@MainActor optional func application(_ application: NSApplication, open urls: [URL])
来进行处理。
吐个槽:这么做实在有些弱智。
所以我们所需要的正确做法就是:
- 在SwiftUI的应用中,使用
onOpenURL(perform:)
处理单个文件的双击打开。 - 如果是多个文件被双击打开,则通过
NSApplicationDelegate
的application(_:open:)
方法处理剩下的文件。