#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. Итак, вы задали вопрос и ответили сами, а затем приняли ваш ответ?