我在创建新的UIViewControllerRepresentable
时遇到了问题,因为makeUIViewController
方法在UIViewControllerRepresentable
中只运行一次,从而阻止对新视图的更新.在保持ControllerView
内MyView
的隐私的同时,修改此代码的最佳方式是什么?
private struct ControllerView<Content: View>: View {
struct MyView<ContentM: View>: UIViewControllerRepresentable {
let rootView: ContentM
init(rootView: ContentM) {
self.rootView = rootView
print("init MyView")
}
func makeUIViewController(context: Context) -> UIViewController {
print("makeUI")
/// create my custom VC
return UIHostingController(rootView: rootView)
}
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
print("updateUI")
}
}
let rootView: () -> Content
@Binding var isGreen: Bool
init(isGreen: Binding<Bool>,@ViewBuilder rootView: @escaping () -> Content) {
self.rootView = rootView
self._isGreen = isGreen
}
var body: some View {
ZStack {
MyView(rootView: rootView())
Button {
isGreen.toggle()
} label: {
Text("Change")
}
}
}
}
private struct GreenView: View {
var body: some View {Color.green.ignoresSafeArea()}
}
private struct OrangeView: View {
var body: some View {Color.orange.ignoresSafeArea()}
}
struct SwiftUIView21: View {
@State var isGreen: Bool = true
var body: some View {
ControllerView(isGreen: $isGreen) {
if isGreen {
GreenView()
} else {
OrangeView()
}
}
}
}
#Preview {
SwiftUIView21()
}