繁体   English   中英

SwiftUI 从不同的视图添加新项目时,ObservedObject 不会更新

[英]SwiftUI ObservedObject does not updated when new items are added from a different view

我有一个视图 model ,它在应用程序启动和添加新项目时处理新数据的加载。 从新视图(例如工作sheet甚至NavigationLink )添加新项目时,我在显示新项目时遇到了问题。

查看 Model

class GameViewModel: ObservableObject {
    //MARK: - Properties
    @Published var gameCellViewModels = [GameCellViewModel]()
    var game = [GameModel]()
    
    init() {
        loadData()
    }
    
    func loadData() {
        if let retrievedGames = try? Disk.retrieve("games.json", from: .documents, as: [GameModel].self) {
            game = retrievedGames
        }
        
        self.gameCellViewModels = game.map { game in
            GameCellViewModel(game: game)
        }
        print("Load--->",gameCellViewModels.count)
    }
    
    func addNew(game: GameModel){
        self.game.append(game)
        saveData()
        loadData()
    }
    
    private func saveData() {
        do {
            try Disk.save(self.game, to: .documents, as: "games.json")
        }
        catch let error as NSError {
            fatalError("""
                Domain: \(error.domain)
                Code: \(error.code)
                Description: \(error.localizedDescription)
                Failure Reason: \(error.localizedFailureReason ?? "")
                Suggestions: \(error.localizedRecoverySuggestion ?? "")
                """)
        }
    }
}

视图加载 ViewModel 数据, leading添加按钮能够添加和显示数据,但打开新视图的trailing不会更新视图。 我必须杀死应用程序才能获取新数据。

    NavigationView{
        List {
            ForEach(gameList.gameCellViewModels) { gameList in
                CellView(gameCellViewModel: gameList)
            }
        }.navigationBarTitle("Games Played")
            .navigationBarItems(leading: Text("Add").onTapGesture {
                let arr:[Int] = [1,2,3]
                self.gameList.addNew(game: GameModel(game: arr))
                }, trailing: NavigationLink(destination: ContentView()){
                    Text("Play")
            })
    }

播放查看示例

@State var test = ""
var body: some View {
    VStack(){
        TextField("Enter value", text: $test)
            .keyboardType(.numberPad)
        
        Button(action: {
            var arr:[Int] = []
            arr.append(Int(self.test)!)
            self.gameList.addNew(game: GameModel(game: arr))
        }) {
            Text("Send")
        }
    }
}

据我所知,问题似乎在这里:

List {
   // Add id: \.self in order to distinguish between items 
   ForEach(gameList.gameCellViewModels, id: \.self) { gameList in                    
      CellView(gameCellViewModel: gameList)                    
   }
}

ForEach 需要一些东西来定位自己,以便知道哪些元素已经显示,哪些没有。

如果这没有解决问题。 请更新您提供的代码以创建一个最小的、可重现的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM