我是 SwiftUI 編碼的新手。我有一個具有以下資料結構的 JSON 檔案。按下按鈕時嘗試使用 TextField 變數更新特定鍵的值。我能夠讀取 JSON 檔案內容,但無法弄清楚如何更新特定密鑰并寫回檔案。這是一個測驗 MacOS 應用程式。請幫我。提前致謝。
\\settingsData.json
[
{
"id" : 1001,
"username": "example",
"password": "123456",
}
]
import SwiftUI
import Foundation
var jsonArray: [jsonModel] = readJSON("settingsData")
struct testJSON: View {
@State private var UserName: String = ""
var body: some View {
VStack (alignment: .leading) {
ForEach(jsonArray) { jsonValue in
Text("Username is \(jsonValue.username)")
}
TextField("Username", text: $UserName)
Button(action: {
// Update array and save to file
print("Done")
})
{
Text("Save")
}
}
}
}
這是模型
struct jsonModel: Hashable, Codable, Identifiable {
var id: Int
var username: String
var password: String
}
這是我用來從 App 目錄中的檔案讀取 JSON 資料的簡單代碼。
func readJSON<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: "json")
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
print(file)
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
let jsonData = try decoder.decode(T.self, from: data)
return jsonData
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
uj5u.com熱心網友回復:
這是一些代碼,向您展示如何在 macOS 上讀取和寫入檔案(給定正確的權限)。
有了這個,您應該能夠撰寫代碼來“......更新特定的密鑰并寫回a檔案......”。
正如我在評論中提到的,應用程式包是只讀的。因此,您必須使用 FileManager 將更新寫入“documentDirectory”(例如)。
import Foundation
import SwiftUI
@main
struct MacApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject var dataManager = DataManager()
@State private var userName: String = ""
var body: some View {
VStack (alignment: .leading) {
ForEach(dataManager.jsonArray) { jsonValue in
Text("Username is \(jsonValue.username)")
}
TextField("Username", text: $userName)
Button(action: {
// Update array, just for testing update all userName
for i in dataManager.jsonArray.indices {
dataManager.jsonArray[i].username = userName
}
// save to file
dataManager.saveToFile()
print("Done")
})
{
Text("Save")
}
}.frame(width: 444, height: 444)
}
}
class DataManager: ObservableObject {
@Published var jsonArray: [JsonModel] = []
var fileName = "settingsData"
init() {
readFromFile()
}
func readFromFile() {
jsonArray = readJSONBundle(fileName) // do this only the first time you open the app
// readJSON() // read from the saved file
}
private func readJSONBundle<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: "json")
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
print(file)
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
let jsonData = try decoder.decode(T.self, from: data)
return jsonData
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
func saveToFile() {
do {
let furl = try FileManager.default
.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent(fileName)
.appendingPathExtension("json")
print("---> writing to: \(furl)")
let data = try JSONEncoder().encode(jsonArray)
try data.write(to: furl)
} catch {
print("---> error saveToFile: \(error)")
}
}
func readJSON() {
do {
let furl = try FileManager.default
.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent(fileName)
.appendingPathExtension("json")
print("---> reading from: \(furl)")
let data = try Data(contentsOf: furl)
let decoder = JSONDecoder()
let jsonData = try decoder.decode([JsonModel].self, from: data)
jsonArray = jsonData
} catch {
print("---> error reading from file: \(error)")
}
}
}
struct JsonModel: Hashable, Codable, Identifiable {
var id: Int
var username: String
var password: String
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411980.html
標籤:
上一篇:如何使用Python在Mac上更改.mp3檔案的標題(不是檔案名)?
下一篇:處理程式是否屬于創建它的執行緒?
