【发布时间】:2019-11-01 00:11:43
【问题描述】:
我有一个消息示例列表,这些示例使用字符串插值使示例与用户更相关。因为我发现在启动类之前不能使用变量,所以创建为一个空的[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])")
}
}
我希望每次globalVars.listPos 被选择器更改时运行init() 语句中的代码。感谢您的帮助:)
【问题讨论】:
-
使用 @Published 而不是 PassthroughSubject
-
使用
@Published有什么好处?在我看来,它做同样的事情......问题仍然存在。
标签: swift swiftui string-interpolation