【发布时间】:2021-10-22 12:41:33
【问题描述】:
我目前正在工作表视图中添加新播放器,在我关闭工作表视图后,主视图 ForEach 循环应该更新所有项目,但它没有。
在 ViewModel 中,我将播放器保存到 json 文件中,保存后我立即获取它。
在工作表视图中保存新用户名后,它会使用新用户名打印数组,但 ForEach 循环不会在视图中更新。
关闭工作表视图后如何重新加载视图?
我的主视图:
struct PlayersView: View {
@ObservedObject var viewModel: PlayersViewModel
@State var course: Course
@State var isSelected: Bool = false
@State private var selectedItem: [Bool]
@State var selectedPlayers = [String]()
init(viewModel: PlayersViewModel, course: Course) {
self.viewModel = viewModel
self._selectedItem = State(initialValue: Array(repeating: false, count: viewModel.players.count))
self.course = course
}
var body: some View {
VStack {
ForEach(0..<viewModel.players.count) { item in
PlayerCell(isSelected: selectedItem[item], player: viewModel.players[item].playerName)
.onTapGesture {
selectedItem[item].toggle()
if selectedPlayers.contains(viewModel.players[item].playerName) {
self.selectedPlayers = selectedPlayers.filter({ $0 != viewModel.players[item].playerName})
} else {
selectedPlayers.append(viewModel.players[item].playerName)
}
}
}
}
我的 viewModel 看起来像这样:
class PlayersViewModel: ObservableObject {
@Published var players = [Player]()
init() {
readJSON()
}
func saveJSON(username: String) {
var array = players
array.append(Player(playerName: username))
do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("example2.json")
try JSONEncoder().encode(array)
.write(to: fileURL)
readJSON()
} catch {
print(error.localizedDescription)
}
}
func readJSON() {
do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("example2.json")
let data = try Data(contentsOf: fileURL)
let players = try JSONDecoder().decode([Player].self, from: data)
self.players = players
print(players)
} catch {
print(error.localizedDescription)
}
}
}
【问题讨论】:
-
你好,PlayersView是sheet的code还是要更新的View的code?无论如何,请添加缺少的视图的代码。
-
您能否显示工作表视图以及如何调用它,因为您可以在此工作表中进行更新。
-
你需要将
course和selectedItems从PlayersView移动到视图模型中,否则你没有正确使用SwiftUI状态变量,你可能会遇到麻烦。此外,当您部分在视图上执行逻辑并部分在视图模型中执行逻辑时,您很难得到正确的逻辑。
标签: swift foreach swiftui reload