json - 在Mac Catalyst中运行的iOS应用程序中的DropInteraction中接收JSON文件

标签 json swift drag-and-drop mac-catalyst local-files

tl;dr:无法在 Mac Catalyst 中运行的 iOS 应用程序中加载通过 DropInteraction 接收的 JSON 文件。

我目前正在重构现有的 (Swift) iOS 代码库,以便在 Mac Catalyst 下的 macOS 上运行,但在读取、加载甚至查看我的 UIDropInteractionDelegate 接收的 JSON 文件时遇到问题。

我在这里遵循示例:https://appventure.me/guides/catalyst/how/drag_and_drop.html

我正在尝试删除一个文件 snse.json,它是一个常规的 pretty-print 的 JSON 文本文件,但在 func 3 (performDrop) 中, session.items 是一个单项数组,其中没有任何有用的内容。

当我在 performDrop 中抛出断点时,我得到以下调试输出:

(lldb) po session.items.first?.itemProvider
▿ Optional<NSItemProvider>
  - some : <NSItemProvider: 0x600003876ca0> {types = (
    "public.json",
    "com.apple.finder.node"
)}

(lldb) po session.items.first?.itemProvider.suggestedName
▿ Optional<String>
  - some : "snse.json"

(lldb) po session.items.first?.localObject
nil

(lldb) po session.items.first?.previewProvider
nil

(lldb) po session.items.first?.itemProvider.canLoadObject(ofClass: URL.self)
▿ Optional<Bool>
  - some : false

(lldb) po session.items.first?.itemProvider.canLoadObject(ofClass: String.self)
▿ Optional<Bool>
  - some : false

这是我到目前为止的代码:

class SentimentViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.interactions.append(UIDropInteraction(delegate: self))
    }
}


extension SentimentViewController: UIDropInteractionDelegate {
    
    static let JSONTypeIdentifier = "public.json"
    
    // 1
    func dropInteraction(_ interaction: UIDropInteraction,
                         canHandle session: UIDropSession) -> Bool {
        return session.hasItemsConforming(toTypeIdentifiers: [JSONTypeIdentifier])
    }

    // 2
    func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
        return UIDropProposal(operation: .copy)
    }

    // 3
    func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
        // This is called with an array of NSURL
        let _ = session.loadObjects(ofClass: URL.self) { urls in
            for url in urls {
                self.importJSONData(from: url)
                print(url)
            }
        }
    }
    
    private func importJSONData(from url: URL) {
        print("I would love to load data from \(url).")
    }
}

我确信我做错了什么,但我就是不知道是什么。 我需要请求读取本地文件的权限吗? 我是否漏掉了一步? 非常感谢任何帮助!

最佳答案

您不需要 URL,因为放置项目已经具有 JSON 数据的项目提供程序,因此只需从 NSItemProvider 中提取该数据并进行解码即可。

这里是固定部分(使用 Xcode 12.1 测试)

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
    session.items.forEach { item in
        guard item.itemProvider.hasItemConformingToTypeIdentifier(SentimentViewController.JSONTypeIdentifier) else { return }
        item.itemProvider.loadDataRepresentation(forTypeIdentifier: SentimentViewController.JSONTypeIdentifier) { data, error in
            if let data = data {
                self.importJSONData(from: data)
            }
        }
    }
}

private func importJSONData(from data: Data) {
    print("Decode JSON from \(data.description).")
}

关于json - 在Mac Catalyst中运行的iOS应用程序中的DropInteraction中接收JSON文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64978633/

相关文章:

java - 想要隐藏由 Jackson 映射到 JSON 的对象的某些字段

json - 如何使用 NSURLSession 在 Swift 中解析 JSON

swift - 无法覆盖 prepareForSegue 函数

c++ - 异步 OLE 拖放可能吗?

reactjs - 拖放库 dnd-kit 在我的 React 示例中不起作用

javascript - 在 javascript 中检测 HTML5 拖放支持

php - pg_query() : Query failed: ERROR: more than one row returned by a subquery used as an expression

java - 在 Spring 应用程序中使用 RestTemplate 从 JSON 获取值

ios - SWIF 错误消息 : Instantiated view controller . ..但没有获得 UICollectionView。

ios - UITableView 未显示正确的行数