在 iOS 应用程序 运行 中的 Mac Catalyst 中的 DropInteraction 中接收 JSON 文件
Receive JSON file in DropInteraction in iOS app running in Mac Catalyst
tl;dr:无法在 iOS 应用程序 运行ning 中加载通过 DropInteraction 接收的 JSON 文件 Mac Catalyst。
我目前正在 Mac Catalyst 下将我现有的 (Swift) iOS 代码库重构为 运行,但在读取、加载甚至查看时遇到问题我的 UIDropInteractionDelegate
.
收到的 JSON 个文件
我正在按照此处的示例进行操作:https://appventure.me/guides/catalyst/how/drag_and_drop.html
我正在尝试删除一个文件 snse.json
,它是一个普通的印刷精美的 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,因为drop item已经有JSON数据的item provider,所以只需要从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).")
}
tl;dr:无法在 iOS 应用程序 运行ning 中加载通过 DropInteraction 接收的 JSON 文件 Mac Catalyst。
我目前正在 Mac Catalyst 下将我现有的 (Swift) iOS 代码库重构为 运行,但在读取、加载甚至查看时遇到问题我的 UIDropInteractionDelegate
.
我正在按照此处的示例进行操作:https://appventure.me/guides/catalyst/how/drag_and_drop.html
我正在尝试删除一个文件 snse.json
,它是一个普通的印刷精美的 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,因为drop item已经有JSON数据的item provider,所以只需要从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).")
}