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

问题描述 投票:-2回答:1

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

我需要为每个按钮分配indexPath.row,以便第一个按钮填充来自第一个JSON对象的信息,第二个按钮填充来自第二个JSON对象的信息,以此类推...这里有一个示例下表。我希望每个按钮都可以通过api传递的“标题”将不同的事件保存到用户的日历中。 (与您在下面看到的“标题” UILabel传递的标题相同。)我还希望“说明”自动填充api中的说明。我已经使用可解码的方式导入了json信息。

enter image description here

这里是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信息来在每行中按“保存到日历”按钮时自动填充该信息。

任何建议都值得赞赏。

自定义Xib单元类代码:

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

}
ios arrays swift uitableview eventkit
1个回答
0
投票

重写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: 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?)
        }
    })
}

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

© www.soinside.com 2019 - 2024. All rights reserved.