我有一个消息示例列表,这些示例使用字符串插值使该示例与用户更加相关。因为我发现在初始化类之前不能使用变量,所以将其创建为空的[String]
,然后在init()
之后分配一个值。但是,然后使用选择器更改字符串中使用的变量。另外,该类用作@EnvironmentVariable
,因此所有更改后的内容都会发送到发布者,这就是我认为存在的问题–我认为插值存在一些问题,无法让其订阅到发布商更改。
该类的定义如下:
class GlobalVars: ObservableObject {
let objectWillChange = PassthroughSubject<GlobalVars,Never>()
var listToChooseFrom: [String] = [
"a list",
"of options",
"to be chosen from"
] {
didSet {
objectWillChange.send(self)
}
}
var listPos: Int = 0 {
didSet {
objectWillChange.send(self)
}
}
var stringToChange: String {
didSet {
objectWillChange.send(self)
}
}
var output: [String] {
didSet {
objectWillChange.send(self)
}
}
init() {
switch listPos {
case 0:
stringToChange = "a value"
case 1:
stringToChange = "another value"
default:
stringToChange = "toodleydoo"
}
output = [
"a list",
"with several variables",
"defined above",
"and one modified within the init() statement",
"referenced within strings",
"like \(stringToChange)."
]
}
}
如此定义选择器,并相对于listPos
更改listToChooseFrom
的值:
Picker("Select an option", selection: $globalVars.listPos) {
ForEach(0 ..< globalVars.listToChooseFrom) {
Text("\(self.globalVars.listToChooseFrom[$0])")
}
}
我希望每次选择器更改init()
时,运行globalVars.listPos
语句中的代码。感谢您的帮助:)
答案 0 :(得分:0)
现实世界不像SwiftUI世界。仅仅因为this
是使用messages
的内插值形成的,仅更改messages
也不会神奇地更改this
。当this
发生变化时,您必须重新设置messages
。