【发布时间】:2020-10-14 16:13:21
【问题描述】:
假设您有一个我想与 SwiftUI 一起使用的旧版视图控制器。视图控制器有一个包含当前状态的 @Published 属性:
class LegacyViewController: UIViewController {
enum State {
case opened
case closed
case halfOpened
}
@Published var state: State
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
self.state = .closed
super.init(nibName: nil, bundle: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
// state is changed after some time
}
}
理想情况下,我想像这样在 SwiftUI 中使用它:
struct ContentView: View {
@State var state: LegacyViewController.State
var body: some View {
VCWrapper(state: $state).overlay (
Text("\(state)")
)
}
}
这意味着我需要实现UIViewControllerRepresentable 协议:
struct VCWrapper: UIViewControllerRepresentable {
@Binding var state: LegacyViewController.State
func makeUIViewController(context: Context) -> LegacyViewController {
let vc = LegacyViewController(nibName: nil, bundle: nil)
/// where to perform the actual binding?
return vc
}
func updateUIViewController(_ uiViewController: LegacyViewController, context: Context) {
}
}
但是,我无法确定从LegacyViewController 的state 属性到VCWrapper 公开的state 属性的实际绑定位置。如果LegacyViewController 暴露了一个委托,我可以通过Coordinator 对象实现绑定,但考虑到我不使用委托对象,我不太确定如何执行此操作?
【问题讨论】: