【发布时间】:2020-10-21 16:38:28
【问题描述】:
我正在尝试在我的 SwiftUI 应用中实现一些 UIKit 组件。我已成功将 UISlider 添加到我的 SwiftUI 视图中。但有一件事困扰着我。当我移动滑块时,值更新正常,但我很好奇为什么 context.coordinator.value.wrappedValue 保持不变?这是我的实现:
import SwiftUI
struct UISliderView: UIViewRepresentable {
typealias UIViewType = UISlider
@Binding var value: Double
var minValue: Double
var maxValue: Double
func makeUIView(context: Context) -> UISlider {
let slider = UISlider(frame: .zero)
slider.maximumValue = Float(minValue)
slider.maximumValue = Float(maxValue)
slider.value = Float(value)
slider.addTarget(context.coordinator,
action: #selector(Coordinator.valueChanged(_:)),
for: .valueChanged)
return slider
}
func updateUIView(_ uiView: UISlider, context: Context) {
print("Value: \(value)")
print("Wrapped value: \(context.coordinator.value.wrappedValue)")
uiView.value = Float(value)
}
func makeCoordinator() -> Coordinator {
let coordinator = Coordinator(value: $value)
coordinator.id = 5
return coordinator
}
class Coordinator: NSObject {
var value: Binding<Double>
var id: Int = 0
init(value: Binding<Double>) {
self.value = value
}
@objc func valueChanged(_ sender: UISlider) {
value.wrappedValue = Double(sender.value)
}
}
}
现在这是困扰我的部分:
print("Value: \(value)")
print("Wrapped value: \(context.coordinator.value.wrappedValue)")
这些值应该相同,或者至少我希望它们相同,但实际上它们不是?
【问题讨论】:
-
这只是更新顺序的问题...不要在那里检查。只需使用 - 它可以正常工作。使用 Xcode 12 / iOS 14 测试。
-
如果这是更新顺序的情况,那么 context.coordinator.value.wrappedValue 将具有先前的值...在这种情况下,如果您调用 UISlider init 并使用 30 作为值,context.coordinator.value。 WrappedValue 将始终打印 30。此外,应首先在 Coordinator 绑定上调用移动滑块。
-
正如 Asperi 所说,这是一个时间问题。
context.coordinator尚未更新。如果您将coordinator设为实例变量并进行比较,您会发现它已 更新。只是 Context 是一个结构体,还没有更新。你不应该关心它。 -
updateUIView中的代码在您的示例中也无关紧要,因为视图 已经 具有正确的值。updateUIView代码用于当您从外部更改绑定时,即,如果您有一个按钮可以从 ContentView 等更改绑定。