невозможно загрузить сохраненные данные JSON в представление - PullRequest
1 голос
/ 21 апреля 2019

В приложении на основе документа, которое я создал, у меня есть представление под названием «TestDraw», где я могу перетаскивать UILables из collectionView.На «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)
}
}

Я думаю, что проблема, вероятно, заключается в процессе декодирования информации.Надеясь, что кто-то может дать мне некоторую подсказку.Это первый раз, когда я пытался создать сложное приложение самостоятельно.

1 Ответ

1 голос
/ 22 апреля 2019

Я думаю, вы могли бы сузить это дальше.У вас есть эта строка

return try? JSONEncoder().encode(self)

И вы обрабатываете ноль возвратов в своем коде, и это нормально.

Но если вы подозреваете, что ваша кодировка может быть неудачной, один из способов получить более подробную информацию -использовать правильный do - catch блок вокруг try вместо try?.Если вы начнете с простого вывода ошибки на консоль, это может помочь.По моему опыту, эти сообщения помогают указать, почему что-то не может быть закодировано (или декодировано).

...