我用UIViewControllerRepresentable
创建了这个非常简单的包装:
struct ViewControllerWrapperView: UIViewControllerRepresentable {
let controller: UIViewController
func makeUIViewController(context: UIViewControllerRepresentableContext<ViewControllerWrapperView>) -> UIViewController {
return controller
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ViewControllerWrapperView>) {}
}
使用它在SwiftUI视图中显示ViewController效果良好:
struct ContentView: View {
@State private var viewSwitch: Bool = true
let blueView: ViewControllerWrapperView = {
let blueViewController = UIViewController()
blueViewController.view.backgroundColor = .blue
return ViewControllerWrapperView(controller: blueViewController)
}()
let redView: ViewControllerWrapperView = {
let redViewController = UIViewController()
redViewController.view.backgroundColor = .red
return ViewControllerWrapperView(controller: redViewController)
}()
var body: some View {
Button("Switch") { viewSwitch.toggle() }
if viewSwitch {
blueView
} else {
redView
}
}
}
但当我把ViewControllerWrapperView
个包裹在AnyView
中时,它们就停止正常工作了:
struct ContentView: View {
@State private var viewSwitch: Bool = true
let blueView: AnyView = {
let blueViewController = UIViewController()
blueViewController.view.backgroundColor = .blue
return AnyView(ViewControllerWrapperView(controller: blueViewController))
}()
let redView: AnyView = {
let redViewController = UIViewController()
redViewController.view.backgroundColor = .red
return AnyView(ViewControllerWrapperView(controller: redViewController))
}()
var body: some View {
Button("Switch") { viewSwitch.toggle() }
if viewSwitch {
blueView
} else {
redView
}
}
}
对于AnyView
,点击按钮时视图不会切换.深入研究后,我发现了以下几点:
首次显示视图时,对于这两种情况:
- 对于蓝色视图,
ViewControllerWrapperView
上调用makeUIViewController
. - 对于蓝色视图,在
ViewControllerWrapperView
上调用updateUIViewController
,参数uiViewController
是蓝色ViewController.
现在,如果没有AnyView
,当点击switch 按钮时,UIViewControllerRepresentable
的生命周期将按预期执行:
- 对于蓝色视图,在
ViewControllerWrapperView
上调用updateUIViewController
,参数uiViewController
是蓝色ViewController. - 对于红色视图,
ViewControllerWrapperView
上调用makeUIViewController
. - 对于红色视图,在
ViewControllerWrapperView
上调用updateUIViewController
,参数uiViewController
是红色ViewController. - 调用
dismantleUIViewController
,参数uiViewController
是蓝色视图.
But和AnyView
当点击switch 按钮时,唯一发生的事情是:
- 对于RED视图,在
ViewControllerWrapperView
上调用updateUIViewController
,参数uiViewController
是BLUE ViewController.
我是错过了什么还是这是SwiftUI中的一个bug?