обновление переменной SwiftUI @State по значению, переданному в не работает? (код прилагается) - PullRequest
0 голосов
/ 17 апреля 2020

В приведенном ниже коде после запуска я вижу текст в первой строке «xxxxxxxx», а не «Начальное значение, которое мы хотим». Похоже, что строка "$ strValue.wrappedValue = tempStr" в инициализаторе gcRow не работает?

Вопрос - как исправить, чтобы я мог правильно передать ему начальное значение для дочернего представления, и оно правильно его использует?

Игровые площадки Код:

import SwiftUI
import PlaygroundSupport

struct gcRow : View {
    @State var strValue : String = "xxxxxxxx"
    init(tempStr : String) {
        $strValue.wrappedValue = tempStr  // <== DOESN'T SEEM TO WORK
    }
    var body : some View {
        HStack {
            Text(strValue)
        }
    }
}

struct GCParentView: View {
    var body: some View {
        VStack {
            List {
                gcRow(tempStr: "Initial Value we Want")
            }
        }
    }
}

let gcParentView = GCParentView()
PlaygroundPage.current.liveView = UIHostingController(rootView: gcParentView)

Изображение / Snapshop того, что я вижу после запуска:

enter image description here

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

В swiftUI запрещено изменять переменные @State в инициализаторе. Правильный способ - удалить значение по умолчанию и инициализировать его внутри инициализатора.

Фиксированный код игровой площадки

import SwiftUI
import PlaygroundSupport

struct gcRow : View {
    @State var strValue: String

    init(tempStr: String) {
        _strValue = State(initialValue: tempStr)
    }

    var body : some View {
        HStack {
            Text(strValue)
        }
    }
}

struct GCParentView: View {
    var body: some View {
        VStack {
            List {
                gcRow(tempStr: "Initial Value we Want")
            }
        }
    }
}

let gcParentView = GCParentView()
PlaygroundPage.current.liveView = UIHostingController(rootView: gcParentView)
1 голос
/ 17 апреля 2020

Вы должны использовать это:

init(tempStr: String) {
    _strValue = State(initialValue: tempStr)
}
...