微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI - 从视图显示自定义 ViewController

如何解决SwiftUI - 从视图显示自定义 ViewController

我的 Button 中有一个 View 调用自定义视图控制器 (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()
        })
    }
}

空控制器:

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>) {}
}

这是这种情况下的结果:

demo

有一种方法可以直接使用

let extLibVC = ExternalLibraryClass()
extLibVC.doSomethingAndShowVC(from: vc)

View 中而不从另一个视图控制器传递并避免多个弹出窗口?

基本上我不想看到 RED 视图控制器,而是直接看到 GREEN 控制器。

解决方法

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

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

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。