我已经按照这个stackoverflow 答案将自定义 DayViewController 与 SwiftUI 视图连接起来。这一切都很好。除了,当我需要创建一个新事件时,我会打开一个.sheet()
让用户编辑事件。(我有一个自定义结构,其中包含有关事件的其他详细信息,尽管在 DayViewController 的初始化中我手动将这些结构转换为 DayViewController 的事件)。因此,因为用户可以编辑事件。在他们完成在 SwiftUI 中编辑工作表中的信息之前,我不想将其添加到事件列表中。但是我不知道编辑完成后如何添加事件,因为编辑是在 SwiftUI 中完成的,我需要通过 DayViewController
CustomDayViewController中的 create() 函数创建事件 -
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)")
}
}
桥接器控制器
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 访问它。
任何帮助,将不胜感激!