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/