在Picker更改后,SwiftUI环境变量中的字符串插值未更新

时间:2019-11-01 00:11:43

标签: swift swiftui string-interpolation

我有一个消息示例列表,这些示例使用字符串插值使该示例与用户更加相关。因为我发现在初始化类之前不能使用变量,所以将其创建为空的[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语句中的代码。感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

现实世界不像SwiftUI世界。仅仅因为this是使用messages的内插值形成的,仅更改messages也不会神奇地更改this。当this发生变化时,您必须重新设置messages