首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI:如何从UIViewRepresentable导航到SwiftUI视图

SwiftUI:如何从UIViewRepresentable导航到SwiftUI视图
EN

Stack Overflow用户
提问于 2022-11-16 10:50:42
回答 1查看 33关注 0票数 0

我正在我的SwiftUI应用程序上使用SwiftUI。我将UIKit库与名为UIViewRepresntable的桥类连接起来。在这个类中,我重写了如下函数:

代码语言:javascript
复制
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?,所以整个类CalendarDisplayView,桥:

代码语言:javascript
复制
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视图

代码语言:javascript
复制
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())
  }
}

我试图在函数中创建NavigationLink,但它不能返回,因为这是我从KVKCalendar库重写的函数。

代码语言:javascript
复制
func didSelectEvent(_ event: Event, type: CalendarType, frame: CGRect?){
    NavigationLink(destination: EventDetailScreen(event.ID))
}

此外,我试图附加UIHostingController,但也没有工作。

代码语言:javascript
复制
func didSelectEvent(_ event: Event, type: CalendarType, frame: CGRect?){
    let screen = UIHostingController(rootView: EventDetailScreen(event.ID))
    self.navigationController?.pushViewController(screen, animated: true)
}

我试图搜索如何将视图从UIView类更改为SwiftUI视图类,但没有适当的结果。很可能这条路是错的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-16 11:15:38

实际上,我通过添加一个扩展CalendarDisplayView找到了一个答案

代码语言:javascript
复制
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中添加代码

代码语言:javascript
复制
view.calendar.parentViewController?.navigationController?.pushViewController(EventDetialScreen(event.ID), animated: true)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74459162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档