首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 5: ObservedObject未更新

Swift 5: ObservedObject未更新
EN

Stack Overflow用户
提问于 2020-02-27 03:07:45
回答 1查看 153关注 0票数 0

我创建了一个名为ObservableObject的ActiveQuiz类,我希望在多个视图之间共享信息:

代码语言:javascript
复制
import Foundation

class ActiveQuiz: ObservableObject{
    @Published var iterator = 0
    @Published var questions = createQuiz()
}

在我显示的其中一个视图中,如果点击文本,迭代器就会增加迭代器,而迭代器在将文本移到问题数组中的下一个条目时会更新文本:

代码语言:javascript
复制
import SwiftUI

struct Question: View {
    @ObservedObject var activeQuiz = ActiveQuiz()

    var body: some View {
        Text(self.activeQuiz.questions[self.activeQuiz.iterator].countryInfo.capital)
            .font(.title)
            .onTapGesture(perform: {
                // increase iterator by 1 unless it's at the end, then put back to 0
                self.activeQuiz.iterator = self.activeQuiz.iterator + 1 == self.activeQuiz.questions.count ? 0 : self.activeQuiz.iterator + 1
            } )
    }
}

在另一个视图中,我有一个计数,它显示迭代器所在的位置:

代码语言:javascript
复制
import SwiftUI

struct QuestionCounter: View {
    @ObservedObject var activeQuiz = ActiveQuiz()

    var body: some View {
        Text(String(self.activeQuiz.iterator + 1) + "/" + String(self.activeQuiz.questions.count))
    }
}

来自第一个视图的文本正在按预期更新,但是来自第二个视图的迭代器保持在初始的1/x。

updating :作为一个新的Swift,我不明白为什么ObservableObject ActiveQuiz的共享状态没有在所有正在“观察”它的视图中更新。另外,对于斯威夫特来说,如果我没有包括任何必要的信息来回答我不知道的问题,我很抱歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-27 03:31:46

目前还不清楚如何将这些视图放在一起使用,例如,添加ContentView对其他人可能会有帮助。正如我所看到的,您使用了两个不同的ActiveQuiz实例。因此,您的Question结构有一个实例,您可以更新它的迭代器,而QuestionCounter有它自己的实例,它不是从第一个实例中更新的。我认为解决方案应该是对这两个结构使用@EnvironmentObject (我简化了示例,因为缺少代码):

代码语言:javascript
复制
import SwiftUI
import Combine

class ActiveQuiz: ObservableObject {
    @Published var iterator = 0
}

struct UsingEnvironmentObject: View {

    @EnvironmentObject var activeQuiz: ActiveQuiz
    var body: some View {
        VStack {

            Question() // it will take EnvironmentObject from parent
            QuestionCounter() // this one will take the same EnvironmentObject from parent

        }
    }
}

// more representative solution
struct UsingEnvironmentObject: View {

    @ObservedObject var activeQuiz = ActiveQuiz()

    var body: some View {
        VStack {
            // here you see, that both structs use one instance
            Question()
                .environmentObject(activeQuiz)
            QuestionCounter()
                .environmentObject(activeQuiz)

        }
    }
}

struct Question: View {

    @EnvironmentObject var activeQuiz: ActiveQuiz

    var body: some View {
        Text("some text from question")
            .font(.title)
            .onTapGesture(perform: {
                // increase iterator by 1 unless it's at the end, then put back to 0
                self.activeQuiz.iterator = self.activeQuiz.iterator + 1 == 10 ? 0 : self.activeQuiz.iterator + 1
            } )
    }
}

struct QuestionCounter: View {
    @EnvironmentObject var activeQuiz: ActiveQuiz

    var body: some View {
        Text(String(self.activeQuiz.iterator + 1) + "/10")
    }
}



struct UsingEnvironmentObject_Previews: PreviewProvider {
    static var previews: some View {
        UsingEnvironmentObject()
        .environmentObject(ActiveQuiz())
    }
}

你们将实现这一目标:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60425704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档