【问题标题】:SwiftUI - Show custom ViewController from ViewSwiftUI - 从视图中显示自定义 ViewController
【发布时间】: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


【解决方案1】:

只需使用 NavigationLink, 这使用 NavigationView 将新页面推入堆栈

struct test: View {
var body: some View {
    NavigationView{
        NavigationLink(
            destination: EmptyViewController()
                        .navigationBarTitle(Text("Title"), displayMode: .inline),
            label: {
                Text("SHOW VIEW CONTROLLER")
            })
    }
}

}

【讨论】:

  • 不,Amir,我不需要以不同的方式显示相同的控制器,我需要调用:extLibVC.doSomethingAndShowVC(from: vc),因为它显示了一个新的视图控制器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多