【问题标题】:How to add correct time of event in EventKit (swift 4)?如何在 EventKit(swift 4)中添加正确的事件时间?
【发布时间】:2019-05-09 01:31:06
【问题描述】:

我遇到了一个小问题,当我实现了每隔一个星期五添加一个事件的逻辑时。但是,由于某种原因,时间是错误的。默认情况下,它始终显示 12:00 AM。有没有办法将活动时间设置为下午 6:30?我需要一些帮助来解决这个小问题。我检查了EventKit 文档。但是卡住了。感谢您的帮助。

import UIKit
import EventKit

class EducationPillarViewController: UIViewController {



     override func viewDidLoad() {
        super.viewDidLoad()

    }


    func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) {
        let eventStore = EKEventStore()

        eventStore.requestAccess(to: .event, completion: { (granted, error) in
            if (granted) && (error == nil) {
                let event = EKEvent(eventStore: eventStore)
                event.title = title
                event.startDate = startDate
                event.endDate = endDate
                event.notes = description
                event.calendar = eventStore.defaultCalendarForNewEvents
                do {
                    try eventStore.save(event, span: .thisEvent)

                } catch let e as NSError {
                    completion?(false, e)
                    return

                }
                completion?(true, nil)

            } else {
                completion?(false, error as NSError?)
            }
        })
    }



    @IBAction func MyStudyButtonWasTapped(_ sender: Any) {

        let alertController = UIAlertController(title: "My Study", message:"Every other Fridays at 6:30PM ", preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "Ok", style: .cancel, handler: nil)
        let addtocalendarAction = UIAlertAction(title: "Add to Calendar", style: .default, handler: someHandler)


        alertController.addAction(defaultAction)
        alertController.addAction(addtocalendarAction)
        present(alertController, animated: true, completion: nil)
  }

    func someHandler(alert: UIAlertAction!) {

    let friday = EKRecurrenceDayOfWeek(.friday)


        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .short

      let startWeek = Date().startOfWeek
        let endWeek = Date().endOfWeek



   EKRecurrenceRule(recurrenceWith: .weekly, interval: 2, daysOfTheWeek: [friday], daysOfTheMonth: nil, monthsOfTheYear: nil, weeksOfTheYear: nil, daysOfTheYear: nil, setPositions: nil, end: nil)


    addEventToCalendar(title: "My Study", description: "Every Other Fridays", startDate: startWeek!, endDate: endWeek!)


    let alertControlller = UIAlertController(title: "My Study", message: "My Study event has been added to your calendar", preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "ok", style: .cancel, handler: nil)
        alertControlller.addAction(defaultAction)
        self.present(alertControlller, animated: true, completion: nil)


    }




}

extension Date {
    var startOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let friday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 5, to: friday)
    }

    var endOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let friday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 5, to: friday)
    }
}

【问题讨论】:

    标签: ios swift eventkit


    【解决方案1】:

    您可以在扩展日期块中添加另一个功能

    public func setTime(hour: Int, min: Int, sec: Int) -> Date? {
            let x: Set<Calendar.Component> = [.year, .month, .day, .hour, .minute, .second]
            let cal = Calendar.current
            var components = cal.dateComponents(x, from: self)
    
    
            components.hour = hour
            components.minute = min
            components.second = sec
    
            return cal.date(from: components)
        }
    

    然后,一旦你完成了,将声明 startWeek 变量 let startWeek = Date().startOfWeek 的代码行更改为 var startWeek = Date().startOfWeek。然后在该行下方放置 startWeek = startWeek?.setTime(hour: 12, min: 30, sec: 00)

    最后改变 endWeek 变量

    var endWeek = Date().endOfWeek endWeek = endweek?.setTime(hour: 13, min: 30, sec: 00)

    【讨论】:

    • 嘿@Spencer,我按照你说的实施方式。但是……它仍然显示 12:00AM。
    • 上面写着Result of call to 'setTime(hour:min:sec:)' is unused
    • 我的错,您的代码应该更改为 var startWeek = Date().startOfWeek 而不是 let 和低于 startWeek = startWeek?.setTime(hour: 12, min: 30, sec: 00) 我还编辑了我的原始答案
    • 好的。所以,我实现了你的代码,现在我没有看到我的事件正在创建。嗯...
    • 尝试用 endWeek 做同样的事情,只是将小时设置为 13 而不是 12,所以它应该看起来像这样 var endWeek = Date().endOfWeekendWeek = endWeek?.setTime(hour: 13, min: 30, sec: 00)。发生这种情况是因为您的 endWeek 现在在您的 startWeek 时间之前,因此没有创建事件,因为它在开始之前无法结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多