gpt4 book ai didi

swift - 我如何处理拖动到 SwiftUI 中的停靠栏图标?

转载 作者:行者123 更新时间:2023-12-05 03:46:23 24 4
gpt4 key购买 nike

我已经设置了一个 SwiftUI 应用程序,它似乎可以接受放置在停靠栏图标上的图像,但我不知道在我的应用程序代码中在哪里处理放置的图像。

如何处理将图像(或任何特定文件)拖放到 SwiftUI 应用的停靠栏图标上?

背景

对于使用 NSApplication 的旧式 Swift 代码,处理应用程序停靠栏图标上的文件拖放可以分两步完成:

  1. 在您的 Info.plist 的 CFBundleDocumentTypes 中注册您想要接受的类型。
  2. 实现 application:openFile: (可能还有 application:openFiles:) 在您的 NSApplicationDelegate 上。

这在 a separate question 中有简要记录.

在 Swift UI 中创建应用委托(delegate)(不起作用)

不过,SwiftUI 应用默认不提供应用委托(delegate)。要实现这些功能,您必须 do some additional work :

  1. 创建一个实现 NSObjectNSApplicationDelegate(或 UIApplicationDelegate)的类:

    // or NSApplicationDelegate
    class AppDelegate: NSObject, UIApplicationDelegate {
    // ...
    }
  2. 在您的@main App 实现中,设置委托(delegate):

    ... : App {
    // or @NSApplicationDelegateAdaptor
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

您现在可以实现应用委托(delegate)方法!例如,这将在您的应用启动时打印:

func applicationWillFinishLaunching(_ notification: Notification) {
print("App Delegate loaded!")
}

但是实现 openFile 函数不起作用:

func application(_ sender: NSApplication, openFile filename: String) -> Bool {
print("test", filename)
return false
}

func application(_ sender: NSApplication, openFiles filenames: [String]) {
print("another test", filenames)
}

将文件拖到应用程序上时,这些都不会打印出来。

场景代表?

这似乎是将 AppDelegate 功能分离到 SceneDelegates 中的一些工作的结果:

For those who might bump their heads in this, the equivalent functionality gets called in the scenedelegate now due to the separation of appdelegate’s functionality. The equivalent-ish function is scene(_ scene: openURLContexts:). I haven’t researched if it’s possible to ‘opt out’ of this, but for my purposes there’s no reason not to adopt the new behavior

— m_bedwell 在 application(open: options:) not being called 上(强调)

但是没有明显的方法可以为我们的代码访问 SceneDelegate(这甚至可能不适用于 macOS?)。有一个 promising similar question .

有没有更好的办法?

最佳答案

有一种非常简单的方法可以处理 SwiftUI 中 Dock 图标上的拖放!

  1. 更新您的 Info.plist 以表明您的应用支持您想要的文件类型(就像在旧应用中一样):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <!-- ... -->
    <key>CFBundleTypeName</key>
    <string>Image files</string>
    <key>CFBundleTypeRole</key>
    <string>Viewer</string>
    <key>LSHandlerRank</key>
    <string>Default</string>
    <key>LSItemContentTypes</key>
    <array>
    <string>public.image</string>
    </array>
    </dict>
    </plist>
  2. 在您的 App 中的 body 中,使用 onOpenURL :

    var body: some Scene {
    WindowGroup {
    ContentView()
    .onOpenURL { (url) in
    // Handle url here
    }
    }
    }

— ianivs ( How to handle URL callbacks with new SwiftUI @main startup? )

关于swift - 我如何处理拖动到 SwiftUI 中的停靠栏图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65313313/

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