swiftui - ios14.2(SwiftUI)如何同时刷新detail view和master view
问题描述
嗨我想刷新由主视图下的数据更改触发的详细视图
我的方法是设置一个组合侦听器并从详细视图触发刷新
它在 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()
}
}
}
}
当我从详细视图单击更新时,它应该同时刷新主视图和详细视图。
(流程为 DetailViewModel->MainViewModel->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()
}
}
详细视图
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()
}
}
}
}
我已经记录了调试消息,看起来数据确实发生了变化,但视图没有。
解决方案
推荐阅读
- cron - Azure Functions ncrontab 值
- ruby - 我们应该在创建类时在 Ruby 中添加 attr_* 方法吗?
- html - 如何为移动视图设置悬停动画?
- python - 从 PyCharm 运行 modin.pandas 时无法连接到 Redis
- angular - 如何在通过 UI 登录到 API 期间处理发布用户信用
- erlang - 如何修复 Erlang 中算术方程的 3 个输入的异常错误?
- sql - 过滤 CTE 的结果以最终在 SQL 报告中结束
- nginx - nginx proxy_pass 在 url 中重写不保留原始路径
- php - 带有 PHP Curl 的 WordPress JSON API AUTH
- pandas - 从日期创建数据框时出现问题