繁体   English   中英

SwiftUI - 从视图中显示自定义 ViewController

[英]SwiftUI - Show custom ViewController from View

我的View中有一个Button ,它调用自定义视图 Controller ( UIViewControllerRepresentable ),因为我使用的外部库需要一个视图 controller 作为参数来显示它自己的弹出窗口(当然我不能更改)。

出于这个原因,我创建了这个中间件视图 controller 但是使用这个逻辑,行为不是我想要的......
将打开两个弹出窗口,一个在另一个之上。

这是因为这个库不是在 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>) {}
}

这是这种情况下的结果:

演示

有一种方法可以直接使用

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

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

基本上我不想看到红色视图 controller,而是直接看到绿色视图。

只需使用NavigationLink ,这会使用 NavigationView 将新页面推送到堆栈中

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM