[英]@Binding properties are not refresh view of Child View in SwiftUI
我正在嘗試可重用 View 並將其添加到 ContentView
這是我的子視圖
struct VStackView: View {
@Binding var spacing: Double
@Binding var alignmentIndex: Int
@Binding var elementsCount: Int
private let alignments: [HorizontalAlignment] = [.leading, .center, .trailing]
var body: some View {
VStack(alignment: self.alignments[alignmentIndex], spacing: CGFloat(spacing)) {
ForEach(0..<elementsCount) {
Text("\($0)th View")
}
}
}
}
這是 SuperView
Superview 具有諸如 Stepper、Slider、Picker 之類的控件,用於調整 VStack 的值(對齊、間距等)
我想根據該值顯示結果。 但子視圖沒有改變
struct LayoutView: View {
private let layout: StackLayout
@State private var spacing = 0.0
@State private var alignmentIndex = 0
@State private var alignment: HorizontalAlignment = .leading
@State private var elementsCount: Int = 0
private let alignmentsString = [".leading", ".center", ".trailing"]
private let minValue = 0.0
private let maxValue = 100.0
init(_ layout: StackLayout) {
self.layout = layout
}
var body: some View {
NavigationView {
Form {
Section(header: Text("Controls")) {
VStack(alignment: .leading) {
Text("Spacing: \(Int(spacing))").font(.caption)
HStack {
Text("\(Int(minValue))")
Slider(value: $spacing, in: minValue...maxValue, step: 1)
Text("\(Int(maxValue))")
}
Divider()
Picker("alignment", selection: $alignmentIndex) {
ForEach(0..<self.alignmentsString.count) {
Text("\(self.alignmentsString[$0])")
}
}.pickerStyle(SegmentedPickerStyle())
Divider()
Stepper(value: $elementsCount, in: 0...10) {
Text("Element Count: \(elementsCount)")
}
}
}
VStackView(spacing: $spacing, alignmentIndex: $alignmentIndex, elementsCount: $elementsCount)
}
.navigationBarTitle(Text(layout.rawValue), displayMode: .inline)
}
}
}
我也搜索谷歌,他們推薦@EnviornmentObject。 如果這是正確的,何時使用 @Binding 屬性包裝器。
不是雙向綁定屬性嗎?
簡單地說,當您想在兩個地方共享數據時,您可以使用 @Binding。
當您想在多個視圖中共享數據時,將使用 @Observable 或 @environmetobject。
您在 VStackView 中的 ForEach 循環會產生問題,因為 Swiftui 不知道如何唯一地標識您的每個項目,因此它不知道如何在值更改時更新它們。
像這樣附加您的代碼:
ForEach(0..<elementsCount, id: \.self) {
Text("\($0)th View")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.