I have an issue where the selected date shows up as a different date.
So the screenshot shows Monday as the current day, however the actual day is Tuesday. Underneath the days of the week it does show 'Tuesday, 28 January 2020'.
I tried fixing the issue, but haven't been able to find out what causes the issue.
I made a simple project to see if it occurs as well, and it did.
Here is the code:
import SwiftUI
import KVKCalendar
struct CalendarItem {
var id: Int
let isAllDay: Bool
let color: String
let start: String
let end: String
let title: String
}
struct CalendarDisplayView: UIViewRepresentable {
var selectDate: Date?
public init(selectDate: Date?) {
self.selectDate = selectDate
}
private var calendar: CalendarView = {
var style = Style()
return CalendarView(frame: UIScreen.main.bounds, style: style)
}()
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>) {
}
func makeCoordinator() -> CalendarDisplayView.Coordinator {
Coordinator(self, selectDate: selectDate)
}
// MARK: Calendar DataSource and Delegate
class Coordinator: NSObject, CalendarDataSource, CalendarDelegate {
private var view: CalendarDisplayView
var selectDate: Date?
private var events = [Event]()
init(_ view: CalendarDisplayView, selectDate: Date?) {
self.view = view
self.selectDate = selectDate
super.init()
loadEvents { (events) in
self.events = events
self.view.calendar.reloadData()
}
}
func eventsForCalendar() -> [Event] {
return events
}
func didSelectDate(_ date: Date?, type: CalendarType, frame: CGRect?) {
selectDate = date ?? Date()
loadEvents { (events) in
self.events = events
self.view.calendar.reloadData()
}
}
func loadEvents(completion: ([Event]) -> Void) {
var events = [Event]()
let result = [CalendarItem(id: 0, isAllDay: false, color: "#93c47d", start: "2020-01-25T12:30:00", end: "2020-01-25T16:00:00", title: "Event number 1"), CalendarItem(id: 1, isAllDay: false, color: "#93c47d", start: "2020-01-25T12:30:00+01:00", end: "2020-01-25T16:00:00+01:00", title: "Event number 2"), CalendarItem(id: 2, isAllDay: false, color: "#93c47d", start: "2020-01-18T12:30:00", end: "2020-01-18T16:00:00", title: "Event number 3"), CalendarItem(id: 3, isAllDay: false, color: "#93c47d", start: "2020-01-15T12:30:00", end: "2020-01-15T16:00:00", title: "Event number 3")]
for (index, item) in result.enumerated() {
print(item.start)
let startDate = formatter(date: item.start)
let endDate = formatter(date: item.end)
let startTime = timeFormatter(date: startDate)
let endTime = timeFormatter(date: endDate)
var event = Event()
event.id = index
event.start = startDate
event.end = endDate
event.color = EventColor(UIColor.hexStringToColor(hex: item.color))
event.isAllDay = item.isAllDay
event.isContainsFile = false // !item.files.isEmpty
event.textForMonth = item.title
if event.isAllDay {
event.text = "\(item.title)"
} else {
event.text = "\(startTime) - \(endTime)\n\(item.title)"
}
events.append(event)
}
completion(events)
}
func formatter(date: String) -> Date {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
return formatter.date(from: date) ?? Date()
}
func timeFormatter(date: Date) -> String {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm"
return formatter.string(from: date)
}
}
}
extension UIColor {
static func hexStringToColor(hex: String) -> UIColor {
var cString = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
if cString.hasPrefix("#") {
cString.remove(at: cString.startIndex)
}
if cString.count != 6 {
return UIColor.gray
}
var rgbValue: UInt32 = 0
Scanner(string: cString).scanHexInt32(&rgbValue)
return UIColor(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
}
struct CalendarDisplayView_Previews: PreviewProvider {
static var previews: some View {
CalendarDisplayView(selectDate: Date())
}
}