简体   繁体   English

SwiftUI 从 UIViewController 转到另一个视图

[英]SwiftUI go to another view from UIViewController

I have a project which built with SwiftUI and to be able to use stripe I am now integrating UIKit into this SwiftUI project.我有一个用 SwiftUI 构建的项目,为了能够使用条纹,我现在正在将 UIKit 集成到这个 SwiftUI 项目中。 This is an example of what I want to do.这是我想做的一个例子。 I want to go to another view from UIKit.我想从 UIKit 转到另一个视图。 Here is my content view in SwiftUI.这是我在 SwiftUI 中的内容视图。 If you copy paste this code it will work on your xcode also.如果您复制粘贴此代码,它也适用于您的 xcode。

import SwiftUI
import UIKit

struct ContentView: View {
    var body: some View {
        ViewControllerWrapper(controller: MyViewController.init())
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

class MyViewController: UIViewController{
    lazy var goToAnotherViewButton: UIButton = {
        let button = UIButton(type: .custom)
        button.layer.cornerRadius = 5
        button.backgroundColor = .systemYellow
        button.titleLabel?.font = UIFont.systemFont(ofSize: 22)
        button.setTitle("Go", for: .normal)
        button.addTarget(self, action: #selector(goToAnotherView), for: .touchUpInside)
        return button
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        let stackView = UIStackView(arrangedSubviews: [goToAnotherViewButton])
        stackView.axis = .vertical
        stackView.spacing = 20
        stackView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(stackView)
        NSLayoutConstraint.activate([
            stackView.leftAnchor.constraint(equalToSystemSpacingAfter: view.leftAnchor, multiplier: 2),
            view.rightAnchor.constraint(equalToSystemSpacingAfter: stackView.rightAnchor, multiplier: 2),
            stackView.topAnchor.constraint(equalToSystemSpacingBelow: view.topAnchor, multiplier: 2),
        ])
    }
    
    @objc
    func goToAnotherView() {
            //from this function I want to go to Another View
        }
}

struct ViewControllerWrapper: UIViewControllerRepresentable{
    func makeUIViewController(context: UIViewControllerRepresentableContext<ViewControllerWrapper>) -> UIViewController {
        guard let controller=controller else {
            return UIViewController()
        }
        return controller
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ViewControllerWrapper>) {
    }
    let controller:UIViewController?
    typealias UIViewControllerType = UIViewController
}

You can create instance of UIHostingController and push this controller to navigation controller.您可以创建 UIHostingController 的实例并将此控制器推送到导航控制器。

Example:例子:

struct ContentView1: View {
    var body: some View {
        NavigationView(content: {
            ViewControllerWrapper(controller: MyViewController.init())
        })
        .navigationTitle("View")
        .navigationBarTitle("Text")
    }
}

struct AnotherView: View {
    var body: some View {
        Text("AnotherView In Swiftui")
            .font(.title)
    }
}

struct ContentView1_Previews: PreviewProvider {
    static var previews: some View {
        ContentView1()
    }
}

class MyViewController: UIViewController{
    lazy var goToAnotherViewButton: UIButton = {
        let button = UIButton(type: .custom)
        button.layer.cornerRadius = 5
        button.backgroundColor = .systemYellow
        button.titleLabel?.font = UIFont.systemFont(ofSize: 22)
        button.setTitle("Go", for: .normal)
        button.addTarget(self, action: #selector(goToAnotherView), for: .touchUpInside)
        return button
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        let stackView = UIStackView(arrangedSubviews: [goToAnotherViewButton])
        stackView.axis = .vertical
        stackView.spacing = 20
        stackView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(stackView)
        NSLayoutConstraint.activate([
            stackView.leftAnchor.constraint(equalToSystemSpacingAfter: view.leftAnchor, multiplier: 2),
            view.rightAnchor.constraint(equalToSystemSpacingAfter: stackView.rightAnchor, multiplier: 2),
            stackView.topAnchor.constraint(equalToSystemSpacingBelow: view.topAnchor, multiplier: 2),
        ])
    }
    
    @objc
    func goToAnotherView() {
        //from this function I want to go to Another View
        let vc = UIHostingController(rootView: AnotherView())
        self.navigationController?.pushViewController(vc, animated: true)
    }
}

struct ViewControllerWrapper: UIViewControllerRepresentable{
    func makeUIViewController(context: UIViewControllerRepresentableContext<ViewControllerWrapper>) -> UIViewController {
        guard let controller=controller else {
            return UIViewController()
        }
        return controller
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ViewControllerWrapper>) {
    }
    let controller:UIViewController?
    typealias UIViewControllerType = UIViewController
}

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

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