如何使用 SwiftUI 视图中的后退按钮推送到 UIKit ViewController
How to push to a UIKit ViewController with back button from a SwiftUI View
我已将 SwiftUI View
添加到现有的 UIKit/Storyboard 项目中。 SwiftUI View
嵌入在 UIHostingController
中。但是,我现在想推送到现有的 UIViewController
以便我有一个后退按钮和导航栏。下面的代码显然只是模态地呈现 UIViewController
,我该怎么做?
class DashBoardHostingController: UIHostingController<DashboardView> {
required init?(coder: NSCoder) {
super.init(coder: coder, rootView: DashboardView())
}
}
struct DashboardView: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
HStack {
Text("Workouts")
.font(.title)
.fontWeight(.bold)
.padding(.leading)
Spacer()
Button(action: {
let storyBoard: UIStoryboard = UIStoryboard(name: "Version3", bundle: nil)
let subscribeViewController = storyBoard.instantiateViewController(withIdentifier: "skateListVC") as! SkateListTableViewController
UIApplication.topViewController()?.present(subscribeViewController, animated: true, completion: nil)
}) {
Text("Show More")
}
.padding(.trailing)
}
ZStack {
VStack(alignment: .leading) {
WorkoutListView(workouts: [MockWorkout().getMockWorkout()])
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(20)
.background(Color.white)
.cornerRadius(10)
.padding()
}
}
}
如果不亲自尝试,我认为您的 SwiftUI 视图需要位于 navigationView 中,以便有一个导航控制器可以被推送到上面。如果 UIHostingController
自己提供了一个导航控制器那么你应该可以改变
UIApplication.topViewController()?.present(subscribeViewController, animated: true, completion: nil)
到
UIApplication.topViewController()?.navigationController.pushViewController(subscribeViewController, animated: true)
无论哪种方式,您都需要确保有一个可以推入的导航控制器。
我认为更好的方法实际上是将旧的 UIKit vc 包装在 UIViewControllerRepresentable
中,它可以像普通的 swiftui 视图一样对待。可以在此处找到很棒的教程 Interfacing with UIKit
我已将 SwiftUI View
添加到现有的 UIKit/Storyboard 项目中。 SwiftUI View
嵌入在 UIHostingController
中。但是,我现在想推送到现有的 UIViewController
以便我有一个后退按钮和导航栏。下面的代码显然只是模态地呈现 UIViewController
,我该怎么做?
class DashBoardHostingController: UIHostingController<DashboardView> {
required init?(coder: NSCoder) {
super.init(coder: coder, rootView: DashboardView())
}
}
struct DashboardView: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
HStack {
Text("Workouts")
.font(.title)
.fontWeight(.bold)
.padding(.leading)
Spacer()
Button(action: {
let storyBoard: UIStoryboard = UIStoryboard(name: "Version3", bundle: nil)
let subscribeViewController = storyBoard.instantiateViewController(withIdentifier: "skateListVC") as! SkateListTableViewController
UIApplication.topViewController()?.present(subscribeViewController, animated: true, completion: nil)
}) {
Text("Show More")
}
.padding(.trailing)
}
ZStack {
VStack(alignment: .leading) {
WorkoutListView(workouts: [MockWorkout().getMockWorkout()])
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(20)
.background(Color.white)
.cornerRadius(10)
.padding()
}
}
}
如果不亲自尝试,我认为您的 SwiftUI 视图需要位于 navigationView 中,以便有一个导航控制器可以被推送到上面。如果 UIHostingController
自己提供了一个导航控制器那么你应该可以改变
UIApplication.topViewController()?.present(subscribeViewController, animated: true, completion: nil)
到
UIApplication.topViewController()?.navigationController.pushViewController(subscribeViewController, animated: true)
无论哪种方式,您都需要确保有一个可以推入的导航控制器。
我认为更好的方法实际上是将旧的 UIKit vc 包装在 UIViewControllerRepresentable
中,它可以像普通的 swiftui 视图一样对待。可以在此处找到很棒的教程 Interfacing with UIKit