选择器更改时,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 中的环境变量更改视图?

如何以编程方式更改 swiftUI DatePicker 的选定值

导航回视图时更新 SwiftUI 选择器最小值和最大值

SwiftUI 选择器在 ObservedObject 公共变量更新期间滚动时跳转

如何在 SwiftUI 中将颜色选择器值保存到 UserDefaults 中?

选择器(SegmentedPickerStyle)中的选择效果不佳 - SwiftUI