更新 UIViewRepresentable 中的绑定
Posted
技术标签:
【中文标题】更新 UIViewRepresentable 中的绑定【英文标题】:Update Binding in UIViewRepresentable 【发布时间】:2021-05-13 01:10:36 【问题描述】:我有一个调用 UIViewRepresentable 视图的 swiftUI 视图。在 SwiftUI 视图中,我正在切换 @State 布尔值的状态。
在我的 UIViewRepresentable 视图中,我创建了一个从 SwiftUI 主视图传递过来的绑定。问题是绑定永远不会更新,或者至少在 UIViewRepresentable 视图中没有调用 updateView 函数。我觉得我一定做错了什么,但我只是忽略了它。这是我正在尝试做的一个示例。
import Foundation
import SwiftUI
struct BindingTest: UIViewRepresentable
@Binding var status: Bool
func makeUIView(context: Context) -> UIActivityIndicatorView
let activityIndicator = UIActivityIndicatorView()
activityIndicator.style = .large
return activityIndicator
func updateUIView(_ uiView: UIViewType, context: Context)
print("Hello")
import SwiftUI
struct ChartView: View
@State var status = false
var body: some View
VStack
Spacer()
Button(action:
status = !status
)
Text("Change")
BindingTest(status: $status)
我正在使用 Xcode 12.5 和 Swift 5.4
【问题讨论】:
【参考方案1】:看起来 SwiftUI 在幕后做了一些对我们来说并不明显的聪明才智。因为您实际上并没有使用您在updateUIView
中的绑定,所以它实际上并没有被调用。
但是,如果您将代码更新为以下内容:
func updateUIView(_ uiView: UIViewType, context: Context)
print("Hello \(status)")
然后你会看到它确实被调用了。
PS - 你可以使用status.toggle()
代替status = !status
【讨论】:
感谢我没有想到要尝试这个。我以为绑定会自动调用updateUIView。但正如你所说,SwiftUI 肯定比引擎盖下的更智能。以上是关于更新 UIViewRepresentable 中的绑定的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ObservableObject 更新 UIViewRepresentable
如何通过 Binding 和 ObservedObject 更新 UIViewRepresentable 地图
列表中的 UIViewRepresentable 行在 SwiftUI 中消失