Как перейти к UIViewController из представления SwiftUI, которое находится в NavigationController

#ios #swift #uinavigationcontroller #swiftui

#iOS #swift #uinavigationcontroller #swiftui

Вопрос:

У меня есть SwiftUI View , созданный из делегата сцены внутри, UINavigationController я хотел бы перейти к другому UIViewController из SwiftUI View

Мой делегат сцены, показывающий, как создается мой View экземпляр :

     let vc = UIHostingController(rootView:SwiftUIView())
    let navigationControll = UINavigationController(rootViewController: vc)
    self.window?.rootViewController = navigationControll
    // Present window to screen
    self.window?.makeKeyAndVisible()
  

Как я могу этого добиться?

Ответ №1:

Вам нужно было бы обернуть свой UIViewController в SwiftUI View , а затем перейти к нему.

Например

 struct MyMasterViewController: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> MasterViewController {
        var sb = UIStoryboard(name: "Main", bundle: nil)
        var vc = sb.instantiateViewController(identifier: "MasterViewController") as! MasterViewController
        return vc
    }
    
    func updateUIViewController(_ uiViewController: MasterViewController, context: Context) {
    }
    
    typealias UIViewControllerType = MasterViewController
}
  

и вызвать его просто NavigationLink вот так из SwiftUI View

 struct SwiftUIView: View {
    var body: some View {
        NavigationLink(destination: MyMasterViewController()) {
                           Text("Show Detail View")
        }.navigationBarTitle("Navigation")
    }
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }.   
}
  

Подробнее об обертывании ViewControllers в SwiftUI здесь

Комментарии:

1. Хотя вы можете достичь своей цели, используя этот способ, я не рекомендую такой смешанный способ, потому что NavigationLink кажется, что он все еще нестабилен. Я бы предпочел использовать UINavigationController из UIKit в качестве базового контейнера и использовать представление SwiftUI в качестве представления содержимого, если удобнее создавать любое представление, которое вы хотите, чем с помощью UIKit.

2. Как это нестабильно? Будет ли его использование создавать другую навигацию? Или его нажатие на ту же навигацию, отправьте ответ, связанный с этим кодом

3. Итак, вы задали вопрос и ответили сами, а затем приняли ваш ответ?