如何从 SwiftUI

问题描述

我按照 this stackoverflow answer 将自定义 DayViewController 与 SwiftUI 视图连接起来。这一切都很好。除了,当我需要创建一个新事件时,我会打开一个 .sheet() 来让用户编辑该事件。 (我有一个自定义结构,其中包含有关事件的其他详细信息,尽管在 DayViewController 的初始化中我手动将这些结构转换为 DayViewController 的事件)。 因此,因为用户可以编辑事件。我不想将它添加到事件列表中,直到他们完成在 SwiftUI 中编辑工作表中的信息。 但是我无法弄清楚如何在编辑完成后添加事件,因为编辑是在 SwiftUI 中完成的,我需要通过 DayViewController 中的 create() 函数创建事件 CustomDayViewController-

import UIKit
import CalendarKit

class CalendarController: DayViewController {
    
    convenience init(newVM: Availabilityviewmodel){
        self.init()
        
        self.availabilityviewmodel = newVM
    }
    var availabilityviewmodel = Availabilityviewmodel(newMapper: APIMapper(),newUser: User(id: 0,first_name: "test",last_name: "man",username: "testman",email: "test@test.com",user_password: "test123"))
    
    var generatedEvents = [EventDescriptor]()
    var alreadyGeneratedSet = Set<Date>()
    
    var colors = [UIColor.blue,UIColor.yellow,UIColor.green,UIColor.red]

    private lazy var rangeFormatter: DateIntervalFormatter = {
      let fmt = DateIntervalFormatter()
      fmt.dateStyle = .none
      fmt.timeStyle = .short

      return fmt
    }()

    override func loadView() {
      calendar.timeZone = TimeZone(identifier: "MST")!

      dayView = DayView(calendar: calendar)
      view = dayView
    }
      
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "CalendarKit Demo"
        navigationController?.navigationBar.isTranslucent = false
        dayView.autoScrollToFirstEvent = true
        reloadData()
    }
      
      // MARK: EventDataSource
      
    override func eventsForDate(_ date: Date) -> [EventDescriptor] {
        var events = [Event]()
        
        while availabilityviewmodel.dataLoaded == false {
            
        }
        
        if let availabilities = availabilityviewmodel.timeslots[date] {
            for availability in availabilities {
                let event = Event()
                
                event.startDate = availability.start_time
                event.endDate = availability.end_time
                event.text = availability.availability_type
                event.color = getColorForType(availability.availability_type)
                
                events.append(event)
            }
        }
        return events
    }
    
    
    private func getColorForType(_ availability: String) -> UIColor {
        if availability == "preferred"{
            return UIColor.green
        }
        else if availability == "maybe" {
            return UIColor.yellow
        }
        else {
            return UIColor.red
        }
    }
      
    private func textColorForEventInDarkTheme(baseColor: UIColor) -> UIColor {
      var h: CGFloat = 0,s: CGFloat = 0,b: CGFloat = 0,a: CGFloat = 0
      baseColor.getHue(&h,saturation: &s,brightness: &b,alpha: &a)
      return UIColor(hue: h,saturation: s * 0.3,brightness: b,alpha: a)
    }
      
    // MARK: DayViewDelegate
    
    private var createdEvent: EventDescriptor?
    
    override func dayViewDidSelectEventView(_ eventView: EventView) {
      guard let descriptor = eventView.descriptor as? Event else {
        return
      }
      print("Event has been selected: \(descriptor) \(String(describing: descriptor.userInfo))")
    }
      
    override func dayViewDidBeginDragging(dayView: DayView) {
      endEventEditing()
      print("DayView did begin dragging")
    }
    
    override func dayView(dayView: DayView,willMoveto date: Date) {
      print("DayView = \(dayView) will move to: \(date)")
    }
    
    override func dayView(dayView: DayView,didMoveto date: Date) {
      print("DayView = \(dayView) did move to: \(date)")
    }
      
    override func dayView(dayView: DayView,didLongPresstimelineAt date: Date) {
        // Cancel editing current event and start creating a new one
        
        endEventEditing()
        
        availabilityviewmodel.StartNewAvailability(startDate: MoveTimetoNearestHalfHour(datetoMove: date))
          
        availabilityviewmodel.ShowDateEditor()
    }
    
    private func MoveTimetoNearestHalfHour(datetoMove: Date) -> Date {
        //convert to DateComponent
        let calendar = Calendar.current
        var components = calendar.dateComponents([Calendar.Component.year,Calendar.Component.month,Calendar.Component.day,Calendar.Component.hour,Calendar.Component.minute],from: datetoMove)
        
        if components.minute! < 30 {
            components.minute = 0
        }
        else {
            components.minute = 30
        }
        
        return calendar.date(from: components) ?? datetoMove
    }
        
    override func dayView(dayView: DayView,didUpdate event: EventDescriptor) {
      print("did finish editing \(event)")
      print("new startDate: \(event.startDate) new endDate: \(event.endDate)")
    }
}

BridgerController

import SwiftUI
import UIKit

struct BridgerController: UIViewControllerRepresentable  {
    @Observedobject var availabilityviewmodel: Availabilityviewmodel
    
    func updateUIViewController(_ uiViewController: UIViewControllerType,context: Context) {
    }
    
    func makeUIViewController(context: Context) -> some UIViewController {
        let dayViewController = CalendarController(newVM:availabilityviewmodel)
        return dayViewController
    }
}

我尝试在我的自定义 DayViewController 中创建创建函数的覆盖。但是,我无法从 SwiftUI 访问它。

任何帮助将不胜感激!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)