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