繁体   English   中英

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

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

我想在 tableView 的每一行中都有相同的“保存到日历按钮”,并且每个按钮从 JSON 中打开一个不同的事件,该事件是通过使用可解码的 api 导入的。

I need to assign the indexPath.row for each button so that the first button fills with the information from the first JSON object, the second button fills with the information from the second JSON object, ect... There's an example of the tableview below . 我希望每个按钮使用从 api 传递的“标题”将不同的事件保存到用户的日历中。 (传递给您在下面看到的“标题”UILabel 的相同标题。)我还希望“描述”自动填充来自 api 的描述。 我已经使用可解码导入了 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:)和(description.item.tradeshowDescription)在每行按下“保存到日历”按钮时自动填充信息。 我需要分配 indexPath,以便在保存到日历时自动填充事件的信息是每一行的正确信息。

任何建议表示赞赏。

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

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 中,您必须编写以下 function。

@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")
    }
 }

并将另一个 function 添加到 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM