[英]SwiftUI - Navigate from UITableView (UIViewRepresentable) to View
[英]SwiftUI: How to navigate from UIViewRepresentable to SwiftUI View
我在我的 SwiftUI 应用程序上使用KVKCalendar 。 我将 UIKit 库与名为 UIViewRepresntable 的桥 class 连接起来。 在这个 class 中,我覆盖了 function,它看起来像:
func didSelectEvent(_ event: Event, type: CalendarType, frame: CGRect?){
// in this function i would like to redirect to SwiftUI View called EventDetailScreen(event.ID)
}
我还添加了weak var navigationController: UINavigationController?
在协调器 class 的顶部,所以整个 class CalendarDisplayView,桥:
import SwiftUI
import EventKit
struct CalendarDisplayView: UIViewRepresentable {
@Binding var events: [Event]
@Binding var updatedDate: Date?
private var calendar = CalendarView(frame: .zero)
var selectDate = Date()
func makeUIView(context: UIViewRepresentableContext<CalendarDisplayView>) -> CalendarView {
calendar.dataSource = context.coordinator
calendar.delegate = context.coordinator
calendar.reloadData()
return calendar
}
func updateUIView(_ uiView: CalendarView, context: UIViewRepresentableContext<CalendarDisplayView>) {
context.coordinator.events = events
calendar.reloadData()
}
func makeCoordinator() -> CalendarDisplayView.Coordinator {
Coordinator(self)
}
public init(events: Binding<[Event]>, updatedDate: Binding<Date?>) {
self._events = events
var style = Style()
self._updatedDate = updatedDate
selectDate = Date()
var frame = UIScreen.main.bounds
frame.origin.y = 0
frame.size.height -= 160
calendar = CalendarView(frame: frame, style: style)
}
// MARK: Calendar DataSource and Delegate
class Coordinator: NSObject, CalendarDataSource, CalendarDelegate {
weak var navigationController: UINavigationController? //Added it by myself
func eventsForCalendar(systemEvents: [EKEvent]) -> [Event] {
return events
}
private var view: CalendarDisplayView
var events: [Event] = [] {
didSet {
view.calendar.reloadData()
}
}
var type: CalendarType = .day {
didSet {
view.calendar.set(type: type, date: view.selectDate)
view.calendar.reloadData()
}
}
var updatedDate: Date? {
didSet {
if let date = updatedDate {
view.selectDate = date
view.calendar.reloadData()
}
}
}
init(_ view: CalendarDisplayView) {
self.view = view
super.init()
}
func didSelectDates(_ dates: [Date], type: CalendarType, frame: CGRect?) {
updatedDate = dates.first ?? Date()
}
func didSelectEvent(_ event: Event, type: CalendarType, frame: CGRect?) {
// PROBLEM
}
}
}
CalendarScreen SwiftUI 视图
import SwiftUI
struct CalendarScreen: View {
@State private var typeCalendar = CalendarType.day
@State private var events: [Event] = []
@State private var updatedDate: Date?
@StateObject var viewModel = ViewModel()
var body: some View {
NavigationView {
ZStack(alignment: .trailing) {
CalendarDisplayView(events: $events, updatedDate: $updatedDate)
.edgesIgnoringSafeArea(.bottom)
}
}.onAppear{
viewModel.fetchCalendarEvents()
.navigationViewStyle(StackNavigationViewStyle())
}
}
我尝试在 function 中创建 NavigationLink,但它无法返回,因为这是我从 KVKCalendar 库覆盖的 function。
func didSelectEvent(_ event: Event, type: CalendarType, frame: CGRect?){
NavigationLink(destination: EventDetailScreen(event.ID))
}
此外,我尝试附加 UIHostingController 但也没有用。
func didSelectEvent(_ event: Event, type: CalendarType, frame: CGRect?){
let screen = UIHostingController(rootView: EventDetailScreen(event.ID))
self.navigationController?.pushViewController(screen, animated: true)
}
我试图搜索如何将视图从 UIView class 更改为 SwiftUI 视图 class 但没有正确的结果。 可能是走错了路。
实际上我通过添加扩展 CalendarDisplayView 找到了答案
extension UIView {
var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder?.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
并在 didSelectEvent 中添加代码
view.calendar.parentViewController?.navigationController?.pushViewController(EventDetialScreen(event.ID), animated: true)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.