我正在尝试使用 KVKCalendar 为 iOS 构建日历应用程序但它最初不是为 Swift UI 构建的,所以我有点努力实现我想做的事情。
我的目标是通过段 Controller 更改日历类型(例如每天、每周、每月),就像这个示例(已在 git 存储库中提供)一样。
sampleUI
到目前为止,我设法默认显示每日样式的日历 View 。但我不知道如何从 ContentView.swift 更改其日历类型
有谁知道这种 ViewController ↔ Swift UI 的东西?
我的代码
我的 ContentView.swift 是这样的
import SwiftUI
import KVKCalendar
struct ContentView: View {
@State var events: [Event] = []
@State var selectedType: CalendarType = .week // I want this to change its calendar type.
var body: some View {
VStack{
CalendarDisplayView(events: $events)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
而我的 ContentDisplayView.swift 是这样的import SwiftUI
import EventKit
import KVKCalendar
struct CalendarDisplayView: UIViewRepresentable {
@Binding var events: [Event]
public init(events: Binding<[Event]>) {
self._events = events
}
private var calendar: CalendarView = {
var style = Style()
if UIDevice.current.userInterfaceIdiom == .phone {
style.timeline.widthTime = 40
style.timeline.currentLineHourWidth = 45
style.timeline.offsetTimeX = 2
style.timeline.offsetLineLeft = 2
style.headerScroll.titleDateAlignment = .center
style.headerScroll.isAnimateTitleDate = true
style.headerScroll.heightHeaderWeek = 70
style.event.isEnableVisualSelect = false
style.month.isHiddenTitle = true
style.month.weekDayAlignment = .center
} else {
style.timeline.widthEventViewer = 350
style.headerScroll.fontNameDay = .systemFont(ofSize: 17)
}
style.month.autoSelectionDateWhenScrolling = true
style.timeline.offsetTimeY = 25
style.startWeekDay = .monday
style.timeSystem = .current ?? .twelve
style.systemCalendars = ["Calendar"]
if #available(iOS 13.0, *) {
style.event.iconFile = UIImage(systemName: "paperclip")
}
style.locale = Locale.current
style.timezone = TimeZone.current
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>) {
context.coordinator.events = events
}
func makeCoordinator() -> CalendarDisplayView.Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, CalendarDataSource, CalendarDelegate {
private let view: CalendarDisplayView
var events: [Event] = [] {
didSet {
view.calendar.reloadData()
}
}
init(_ view: CalendarDisplayView) {
self.view = view
super.init()
}
func eventsForCalendar(systemEvents: [EKEvent]) -> [Event] {
return events
}
}
}
最佳答案
首先,添加一个 @Binding
内CalendarDisplayView
所以它可以更新:
@Binding var selectedType: CalendarType
然后,传入 ContentView
的 $selectedType
为 CalendarDisplayView
的 selectedType
,就像你通过的方式 $events
. /// here!
CalendarDisplayView(events: $events, selectedType: $selectedType)
最后,更新updateUIView
里面的类型,每当 @Binding
时都会调用它变化。func updateUIView(_ uiView: CalendarView, context: UIViewRepresentableContext<CalendarDisplayView>) {
context.coordinator.events = events
calendar.set(type: selectedType, date: Date()) /// I've never used this library, so you might need to replace `Date()` with something else
calendar.reloadData()
}
关于ios - SwiftUI - 更改 KVKCalendar 的 CalendarType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68333923/