我创建了一个名为ObservableObject的ActiveQuiz类,我希望在多个视图之间共享信息:
import Foundation
class ActiveQuiz: ObservableObject{
@Published var iterator = 0
@Published var questions = createQuiz()
}在我显示的其中一个视图中,如果点击文本,迭代器就会增加迭代器,而迭代器在将文本移到问题数组中的下一个条目时会更新文本:
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
} )
}
}在另一个视图中,我有一个计数,它显示迭代器所在的位置:
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的共享状态没有在所有正在“观察”它的视图中更新。另外,对于斯威夫特来说,如果我没有包括任何必要的信息来回答我不知道的问题,我很抱歉。
发布于 2020-02-27 03:31:46
目前还不清楚如何将这些视图放在一起使用,例如,添加ContentView对其他人可能会有帮助。正如我所看到的,您使用了两个不同的ActiveQuiz实例。因此,您的Question结构有一个实例,您可以更新它的迭代器,而QuestionCounter有它自己的实例,它不是从第一个实例中更新的。我认为解决方案应该是对这两个结构使用@EnvironmentObject (我简化了示例,因为缺少代码):
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())
}
}你们将实现这一目标:

https://stackoverflow.com/questions/60425704
复制相似问题