【发布时间】:2021-06-04 01:59:15
【问题描述】:
我的View 中有一个Button 调用自定义视图控制器(UIViewControllerRepresentable),因为我使用的外部库需要一个视图控制器作为参数来显示它自己的弹出窗口(和当然我不能改变)。
出于这个原因,我创建了这个中间件视图控制器,但使用这个逻辑,行为不是我想要的......
将打开两个弹出窗口,一个在另一个之上。
这是因为这个库不是在 SwiftUI 中创建的,而是经典的 UIKit。
我做了什么:
内容视图
struct ContentView: View {
@State var showViewController = false
var body: some View {
VStack(alignment: .leading, content: {
Button("SHOW VIEW CONTROLLER") {
showViewController.toggle()
}
})
.sheet(isPresented: $showViewController, content: {
EmptyViewController()
})
}
}
EmptyController:
struct EmptyViewController: UIViewControllerRepresentable {
func makeUIViewController(context: UIViewControllerRepresentableContext<EmptyViewController>) -> UIViewController {
let vc = UIViewController()
vc.view.backgroundColor = .systemRed
let extLibVC = ExternalLibraryClass()
extLibVC.doSomethingAndShowVC(from: vc) // issue here, because I need to pass VC
return vc
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<EmptyViewController>) {}
}
这是这种情况下的结果:
有一种方法可以直接使用
let extLibVC = ExternalLibraryClass()
extLibVC.doSomethingAndShowVC(from: vc)
在View 中不从另一个视图控制器传递并避免多个弹出窗口?
基本上我不想看到 RED 视图控制器,而是直接看到 GREEN 控制器。
【问题讨论】:
-
ExternalLibraryClass 中是否有回调通知它已关闭/完成/完成?
-
顺便说一句,您可以从 rootViewController 显示它,使用类似stackoverflow.com/a/63276688/12299030 的方法。
-
Thanjs Asperi,我选择使用
SwiftUIWindowBinder,它允许我允许点击并且似乎效果很好。我也会尝试HostingWindowFinder。非常感谢您为我指出正确的方式。
标签: ios swift swiftui popup uiviewcontrollerrepresentable