gpt4 book ai didi

ios - 无法将保存的 JSON 数据加载到 View 中

转载 作者:行者123 更新时间:2023-11-28 05:43:20 26 4
gpt4 key购买 nike

在我创建的基于文档的应用程序中,我有一个名为“TestDraw”的 View ,我可以在其中从 collectionView 中拖放 UILable。在“TestDraw”上,也允许自由绘制……

我还设置了 BarItems 以保存用户放置 UILabel 的位置及其上的信息,以便以后可以将该信息解码到卡片对象中...

然而,每次我打开一个我认为已经保存成功的JSON文件,结果却是一片空白……

我尝试将已保存文件的 jsonString 打印到控制台,结果证明是正确的,因此显示信息已成功保存。

这是 NumberCardsSetDocument 中的代码:

class NumberCardsSetDocument: UIDocument {

var numberCardsSet: NumberCardsSet?

override func contents(forType typeName: String) throws -> Any {
// Encode your document with an instance of NSData or NSFileWrapper
return numberCardsSet?.json ?? Data()
}

override func load(fromContents contents: Any, ofType typeName: String?) throws {
if let json = contents as? Data{
numberCardsSet = NumberCardsSet(json: json)
}else {
print("Error trying to load NumberCards. Content is not JSON data")
}
}
}

这是 NumberCardsSet 中的代码:

struct NumberCardsSet: Codable{
var numberCards = [CardInfo]()
struct CardInfo: Codable{
let x: Int
let y: Int
let text: String
let size: Int
}
init?(json:Data){
if let newValue = try? JSONDecoder().decode(NumberCardsSet.self, from: json){
self = newValue
}else{
return nil
}
}
var json: Data? {
return try? JSONEncoder().encode(self)
}
init (numberCards:[CardInfo]){
self.numberCards = numberCards
}
}

这就是我试图加载保存的数据的方法:

class DocumentBrowserViewController: UIDocumentBrowserViewController, UIDocumentBrowserViewControllerDelegate {

override func viewDidLoad() {
super.viewDidLoad()
delegate = self
allowsPickingMultipleItems = false
allowsDocumentCreation = true
template = try? FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("UntitledHMS.json")
if template != nil {
allowsDocumentCreation = FileManager.default.createFile(atPath: template!.path, contents: Data() )
}
}

var template:URL?
// MARK: UIDocumentBrowserViewControllerDelegate

func documentBrowser(_ controller: UIDocumentBrowserViewController, didRequestDocumentCreationWithHandler importHandler: @escaping (URL?, UIDocumentBrowserViewController.ImportMode) -> Void) {
importHandler(template,.copy)
}

func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentsAt documentURLs: [URL]) {
guard let sourceURL = documentURLs.first else { return }
presentDocument(at: sourceURL)
}

func documentBrowser(_ controller: UIDocumentBrowserViewController, didImportDocumentAt sourceURL: URL, toDestinationURL destinationURL: URL) {
presentDocument(at: destinationURL)
}

func documentBrowser(_ controller: UIDocumentBrowserViewController, failedToImportDocumentAt documentURL: URL, error: Error?) {
}

// MARK: Document Presentation
func presentDocument(at documentURL: URL) {
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
let documentVC = storyBoard.instantiateViewController(withIdentifier: "DocumentMVC")
if let trailMakingTestViewController = documentVC.contents as? DocumentViewController{
trailMakingTestViewController.document = NumberCardsSetDocument(fileURL: documentURL)
}
present(documentVC,animated: true)
}
}

我认为问题可能出在解码信息的过程中。希望有人能给我一些线索。这是我第一次尝试自己构建复杂的应用程序。

最佳答案

我认为您可以进一步缩小范围。你有这条线

return try? JSONEncoder().encode(self)

并且您在代码中处理 nil 返回,这没问题。

但是如果您怀疑您的编码可能失败,获得更好信息的一种方法是在 try 周围使用适当的 do - catch block ,而不是使用试试看?。如果您一开始只是将错误打印到控制台,它可能会有所帮助。根据我的经验,这些消息有助于指出为什么无法对某些内容进行编码(或解码)。

关于ios - 无法将保存的 JSON 数据加载到 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55783259/

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