选择器更改时,SwiftUI 环境变量中的字符串插值未更新
Posted
技术标签:
【中文标题】选择器更改时,SwiftUI 环境变量中的字符串插值未更新【英文标题】:String Interpolation Not Updating in SwiftUI Environment Variable When Changed by Picker 【发布时间】: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
有什么好处?在我看来,它做同样的事情......问题仍然存在。
【参考方案1】:
现实世界不像 SwiftUI 世界。仅仅改变this
也不会神奇地改变messages
,因为messages
是使用this
的插值形成的。当this
更改时您必须重新设置messages
。
【讨论】:
最好的方法是什么?获取/设置? 再次执行您在init
中所做的相同操作:设置messages
。
选择器中的值已更改...单独的问题/问题?还是有一些我想念的简单方法来做到这一点?
我不知道您是否遗漏了什么。你的问题几乎没有。没有选择器。如果您需要更多帮助,请显示更多代码。显示足够的代码以便我们重现问题。以上是关于选择器更改时,SwiftUI 环境变量中的字符串插值未更新的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式更改 swiftUI DatePicker 的选定值
SwiftUI 选择器在 ObservedObject 公共变量更新期间滚动时跳转