如何在ios14.2(SwiftUI)中同时刷新详细视图和主视图

如何在ios14.2(SwiftUI)中同时刷新详细视图和主视图,swiftui,ios14,Swiftui,Ios14,嗨,我想刷新由主视图下的数据更改触发的详细视图 我的方法是设置一个联合侦听器,并从细节视图触发刷新 它在ios13上工作,但我不能让它在ios14.2上工作,有什么解决方法吗? 这是我的主视图 import SwiftUI struct MainView: View { @ObservedObject var viewModel : MainViewModel init(){ viewModel = MainViewModel.shared

嗨,我想刷新由主视图下的数据更改触发的详细视图
我的方法是设置一个联合侦听器,并从细节视图触发刷新
它在ios13上工作,但我不能让它在ios14.2上工作,有什么解决方法吗?
这是我的主视图

import SwiftUI

struct MainView: View {
    
    @ObservedObject var viewModel : MainViewModel
    
    init(){
        viewModel = MainViewModel.shared
    }

    var body: some View {
        NavigationView{
            List {
                ForEach(viewModel.games ,id:\.self) { game in
                    NavigationLink(destination: self.navDest(game: game)){
                        Text("\(game)")
                    }
                }
            }
        }
    }
    
    func navDest(game: Int) -> some View{
        print("games value:",game)
        return LazyView(DetailView(game: game ))
    }
}


主视图模型侦听来自详细视图的事件并更新值

import Foundation
import SwiftUI
import Combine


class MainViewModel : ObservableObject {

    @Published var games : [Int] = []
    static let shared = MainViewModel()
    private var tickets: [AnyCancellable] = []
    
    init(){
        for i in 0...5{
            games.append(i)
        }
        addObservor()
    }
    
    func addObservor(){
        NotificationCenter.default.publisher(for: .updateGame)
            .map{$0.object as! Int}
            .sink { [unowned self] (game) in
                self.updateGame(game: game)
            }.store(in: &tickets)
    }
    
    func updateGame(game:Int){
        print("updateView index:",game)
        self.games[game] = 9999
        print("after update",games)
    }
}



import SwiftUI

struct DetailView: View {
    
    @ObservedObject var viewModel : DetailViewModel
    
    init(game: Int) {
        print("init detail",game)
        viewModel = DetailViewModel(game:game)
    }
    
    var body: some View {
        VStack{
            Text("\(viewModel.game)")
            Button("update"){
                viewModel.sendUpdate()
            }
        }
    }
}

当我单击“从详细视图更新”时,它应该同时刷新主视图和详细视图。
(流程是DetailViewModlel->MainViewModlel->refresh MainView->refresh DetailView(当前显示)),但它在iOS 14.2上不起作用

    import Foundation
import SwiftUI


class DetailViewModel : ObservableObject {

    var period : String = ""
    var game : Int = 0
    
//    init(period:String,game: Int){
//        self.period = period
        init(game: Int){
        self.game = game
    }

    func sendUpdate(){
        NotificationCenter.default.post(name: .updateGame, object:  game)
    }
}

extension Notification.Name {
    static let updateGame = Notification.Name("updateGame")
   
}
struct LazyView<Content: View>: View {
    let build: () -> Content
    init(_ build: @autoclosure @escaping () -> Content) {
        self.build = build
    }
    var body: Content {
        build()
    }
}



我已经记录了调试消息,看起来数据确实更改了,但视图没有更改。

触发区域是DetailViewModel下的NotificationCenter。MainView有一个接收它的观察,并触发了MainView和DetailView上的重新加载。如果我在DetailView中按下back按钮,我可以看到数据被刷新,但按下back之前的DetailView没有。我得到了非常类似的结果,在Xcode 12.1中工作正常,但没有更新Xcode 12.2中NavigationView显示的视图。Xcode 12.2内部的14.1模拟器可以,但14.2模拟人生或设备则不行
import SwiftUI

struct DetailView: View {
    
    @ObservedObject var viewModel : DetailViewModel
    
    init(game: Int) {
        print("init detail",game)
        viewModel = DetailViewModel(game:game)
    }
    
    var body: some View {
        VStack{
            Text("\(viewModel.game)")
            Button("update"){
                viewModel.sendUpdate()
            }
        }
    }
}