按下 TableViewCell 中的按钮时将事件从 API 保存到日历

Save Event to Calendar from API when Button in TableViewCell is Pressed

我想在 tableView 的每一行中都有相同的 "Save to Calendar Button",并且每个按钮打开一个不同的事件,这些事件来自 JSON 通过使用 decodable 的 api 导入。

我需要为每个按钮分配 indexPath.row,以便第一个按钮填充来自第一个 JSON object 的信息,第二个按钮填充来自 JSON object 的信息second JSON object, 等等... 下面是一个 tableview 的例子。我希望每个按钮使用从 api 传递的 "Title" 将不同的事件保存到用户的日历中。 (传递给 "Title" UILabel 的标题与您在下面看到的相同。)我还希望 "Description" 自动填充 api 中的描述。我已经使用 decodable 导入了 json 信息。

这是在 viewController:

中找到的 cellForRowAt 代码
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "eventCell", for: indexPath) as! EventTableViewCell
        let item = page!.tradeshows[indexPath.row]

        cell.registrationUrl = item.link
        cell.eventTitle.text = item.title
        cell.eventDate.text = item.tradeshowDescription
        cell.addEventToCalendar(title: item.title!, description: item.tradeshowDescription, startDate: NSDate() as Date, endDate: NSDate() as Date)


        return cell
    }

我需要上面应用的 JSON 信息(标题:item.title!)和(描述:item.tradeshowDescription)在 "Save to Calendar" 按钮时自动填充信息在每一行中按下。我需要分配 indexPath,以便在保存到日历时自动填充事件的信息是每一行的正确信息。

如有任何建议,我们将不胜感激。

自定义 Xib 单元格 Class 在 TableViewCell 中找到的代码:

import UIKit
import EventKit

class EventTableViewCell: UITableViewCell {

    var registrationUrl : URL!

    @IBOutlet weak var eventDate: UILabel!
    @IBOutlet weak var eventTitle: UILabel!
    @IBOutlet weak var saveToCalendarButton: UIButton!
    @IBOutlet weak var registerButton: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code

        selectionStyle = UITableViewCell.SelectionStyle.none
    }


    @IBAction func registerButtonPressed(_ sender: Any) {

        UIApplication.shared.open(registrationUrl)
    }


    @IBAction func saveToCalenderButtonPressed(_ sender: Any) {

       addEventToCalendar(title: "", description: "", startDate: NSDate() as Date, endDate: NSDate() as Date)

    }

    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?)
            }
        })
    }

}

重写 cellForRow 方法。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "eventCell", for: indexPath) as! EventTableViewCell
    let item = page!.tradeshows[indexPath.row]

    cell.registrationUrl = item.link
    cell.eventTitle.text = item.title
    cell.eventDate.text = item.tradeshowDescription
    cell.saveToCalendarButton.tag = indexPath.row
    cell.saveToCalendarButton.addTarget(self, action: #selector(saveToCalenderButtonPressed(sender:)), for: .touchUpInside)


    return cell
}

然后在viewController你必须写下面的函数。

@IBAction func saveToCalenderButtonPressed(_ sender: Any) {

   guard let index = (sender as? UIButton).tag else {return}
   let item = eventArray[index]
   addEventToCalendar(title: item.title ?? "", description:item.tradeshowDescription, startDate: Date(), endDate: Date()){ (granted, error) in
if error == nil{
  print("success")
}else{
  print("error added to calendar")
    }
 }

并将此其他功能添加到 viewController。

func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: Error?) -> 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{
                completion?(false, error)
                return
            }
            completion?(true, nil)
        } else {
            completion?(false, error?)
        }
    })
}

所以您 viewController 负责将事件添加到日历。 当用户触摸单元格中的按钮时,您必须获取数组的索引,发件人标签等于单元格的 indexPath.row。