通过传入的值更新 SwiftUI @State 变量不起作用? (附代码)

updating SwiftUI @State variable by value passed in not working? (code attached)

在下面的代码中 运行 之后,我看到第一行的文本是 "xxxxxxxx" 而不是 "Initial Value we Want"。 gcRow 初始化程序中的“$strValue.wrappedValue = tempStr”行似乎不起作用?

问题 - 如何更正以便我可以正确地将子视图的初始值传递给它,并且它正确使用它?

游乐场代码:

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)

Image/Snapshop 我在启动后看到的内容:

你必须使用这个:

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

在 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)