【问题标题】:SwiftUI ObservedObject not updating across viewsSwiftUI ObservedObject 未跨视图更新
【发布时间】:2020-12-21 00:51:47
【问题描述】:

我无法让可观察对象模型工作。

我有两个视图和一个视图模型的简单演示。视图模型是;

import Foundation

class Score: ObservableObject {

    @Published var total = 0

}

一个按钮视图将总数加一;

struct ScoreButton: View {
    @ObservedObject var score = Score()

    var body: some View {
        Button(action: {
            score.total += 1
        }, label: {
            Text("Add 1 to Total")
        })
    }
}

然后是一个开始视图来显示结果;

struct OBDemo: View {

    @ObservedObject var result = Score()

    var body: some View {
        VStack {
            ScoreButton()
                .padding()
            Text("Total = \(result.total)")

        }
    }
}

如果我将类、按钮和开始视图放在一个文件中,它就可以工作

【问题讨论】:

    标签: swiftui observedobject


    【解决方案1】:

    您正在创建Score 的两个不同 实例:

    struct ScoreButton: View {
        @ObservedObject var result = Score() // instance #1
    
    struct OBDemo: View {
        @ObservedObject var result = Score() // instance #2
    

    您需要在两个视图中使用相同的实例 - 将 @ObservedObject 传递给子视图:

    struct OBDemo: View {
        @ObservedObject var result = Score() // create in the parent view
    
        var body: some View {
            VStack {
                ScoreButton(result: result) // <- pass to the child view
                    .padding()
                Text("Total = \(result.total)")
    
            }
        }
    }
    
    struct ScoreButton: View {
        @ObservedObject var score: Score // declare only
    
        var body: some View {
            Button(action: {
                score.total += 1
            }, label: {
                Text("Add 1 to Total")
            })
        }
    }
    

    【讨论】:

    • 谢谢。如何更新 ScoreButton 的预览?静态变量预览:一些视图 { ScoreButton(score: #?#)
    • @Jmcg 你可以做ScoreButton(score: Score())
    猜你喜欢
    • 2020-07-12
    • 2021-02-17
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多