Передача данных из UIRappresentable - PullRequest
0 голосов
/ 22 марта 2020

У меня есть Catalyst для MacOS приложение просто код для чтения json файла с локального диска и просмотра данных в тексте.

import SwiftUI

final class PickerForReadFile: NSObject, UIViewControllerRepresentable, ObservableObject {
    @Published var geoFolder = GeoFolderCodStruct()

    lazy var viewController:UIDocumentPickerViewController = {
        let vc = UIDocumentPickerViewController(documentTypes: ["geof"], in: .open)
        vc.allowsMultipleSelection = false
        vc.delegate = self
        return vc
    }()

    func makeUIViewController(context: UIViewControllerRepresentableContext<PickerForReadFile>) -> UIDocumentPickerViewController {
        viewController.delegate = self
        return viewController
    }
}

extension PickerForReadFile: UIDocumentPickerDelegate {
    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        if urls.count > 0 {
            DispatchQueue.main.async {
                let url = urls[0]
                do {
                    let data = try Data(contentsOf: url)
                    let decoder = JSONDecoder()
                    decoder.dateDecodingStrategy = .formatted(dateFormatter)
                    let jsonData = try decoder.decode(GeoFolderCodStruct.self, from: data)
                    self.geoFolder = jsonData
                    print("geoFolder: \(self.geoFolder.nomeArchivio)")
                } catch {
                    print("error:\(error)")
                }
            }
        }
    }

    func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
        controller.dismiss(animated: true) {
            print("Cancel from picker view controller")
        }
    }
}

private var dateFormatter: DateFormatter {
    let f = DateFormatter()
    f.dateStyle = .short
    return f
}


import SwiftUI

struct ContentView: View {

    @ObservedObject var picker = PickerForReadFile()
    @State private var geoFolder = GeoFolderCodStruct()

    var body: some View {
        VStack {
            Text("Hello, World!")
            Button(action: {
                #if targetEnvironment(macCatalyst)
                print("Press open file")
                let viewController = UIApplication.shared.windows[0].rootViewController!
                viewController.present(self.picker.viewController, animated: true)
                self.picker.objectWillChange.send()
                #endif
            }) {
                Image(systemName: "book")
            }
            Text(geoFolder.nomeCommittente).padding()
            Text(geoFolder.nomeArchivio).padding()
        }
    }
}

Например, файл, который Я хочу прочитать это:

{
  "nomeCommittente" : "Appple",
  "note" : "Image from Cupertino (CA).",
  "latitudine" : 37.332161,
  "longitudine" : -122.030352,
  "nomeCartella" : "Foto",
  "geoFolderPath" : "\/Users\/cesare\/Desktop",
  "radiusCircle" : 50,
  "dataCreazione" : "20\/03\/2020",
  "nomeArchivio" : "AppleCampus-Image",
  "isActive" : true
}

В ContentView Я пытался вставить этот код, чтобы обновить geoFolder, но я не знаю, как прекратить звонки на частные func urlPickedFoRTextField() -> some View {.

private func urlPickedFoRTextField() -> some View {
    DispatchQueue.main.async {
        let geoF = self.picker.geoFolder
        print("Committente: \(geoF.nomeCommittente) - Archivio: \(geoF.nomeArchivio)")
        self.geoFolder = geoF
        self.picker.objectWillChange.send()
    }
    return TextField("", text: $geoFolder.geoFolderPath)
}

Почему geoFolder не обновляется? Как решить эту проблему? Как я могу обновить geoFolder, без вызова какой-либо функции.

...