gpt4 book ai didi

ios - @Binding 属性不会刷新 SwiftUI 中 subview 的 View

转载 作者:行者123 更新时间:2023-11-28 23:21:35 25 4
gpt4 key购买 nike

我正在尝试可重用 View 并将其添加到 ContentView 上

这是我的 subview

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 的值(对齐、间距等)

我想根据该值显示结果。但是 subview 没有改变

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 属性包装器。

这不是双向绑定(bind)属性吗?

最佳答案

简单来说,当你想在两个地方共享数据时,你可以使用@Binding。

当您想在多个 View 中共享数据时,将使用@Observable 或@environmetobject。

VStackView 中的 ForEach 循环会产生问题,因为 Swiftui 不知道它如何唯一地标识您的每个项目,因此它不知道如何在值更改时更新它们。

像这样附加你的代码:

 ForEach(0..<elementsCount,  id: \.self) {
Text("\($0)th View")
}

关于ios - @Binding 属性不会刷新 SwiftUI 中 subview 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59600917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com