ios - SwiftUI - 更改 KVKCalendar 的 CalendarType

标签 ios swift swiftui

我正在尝试使用 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
        }
    }
    
}

最佳答案

首先,添加一个 @BindingCalendarDisplayView所以它可以更新:

@Binding var selectedType: CalendarType
然后,传入 ContentView$selectedTypeCalendarDisplayViewselectedType ,就像你通过的方式 $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/

相关文章:

ios - 为什么当我将 UIStackView 分布设置为 equalspacing 时 subview 不可见?

swift - 如何从 Swift 中的字符串中删除变音符号?

macos - WKWebView 显示白色条,直到窗口移动/调整大小

ios - UICollectionView 单元格不设置移动动画

swift - tvOS:间歇性调用 pressesEnded

ios - 在 SwiftUI 中平滑地加速旋转

core-data - @FetchRequest 中的 SwiftUI 和动态 NSSortDescriptors

android - 使用 BackBase CXP 检索联系人列表?

ios - 刷新 UIViewController

iphone - 在 UILabel 中使用带有粗体文本的自定义字体