Строковая интерполяция не обновляется в переменной среды SwiftUI при изменении в средстве выбора - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть список примеров сообщений, которые используют интерполяцию строк, чтобы сделать пример более релевантным для пользователя. Поскольку я обнаружил, что нельзя использовать переменные до того, как вы инициируете класс, он создается как пустой [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 голосов
/ 01 ноября 2019

Реальный мир не похож на мир SwiftUI. Простое изменение this также не будет волшебным образом изменять messages только потому, что messages было сформировано с использованием интерполированного значения this. Когда this изменяется , вам необходимо заново установить messages.

...