Swift:UITableView将日历事件数据传递给DetailViewController

Swift:UITableView将日历事件数据传递给DetailViewController,swift,calendar,tableview,ekevent,Swift,Calendar,Tableview,Ekevent,我有一个tableview,它将日历事件动态加载到行中。我正在检查设备的当前事件。我设置了一个detailview,因为我将把事件数据传递给detailview标签。我正在使用故事板分段。但我还不能完成它。有谁能帮我找到我缺少的东西吗 错误为“无法将“EKEvent”类型的值分配给“String”类型” 我应该将EKEvent日期类型转换为字符串吗?或者如何,我需要一个例子。我在练习我的快速技能 下面是我的代码 class MainViewController: UIViewController

我有一个tableview,它将日历事件动态加载到行中。我正在检查设备的当前事件。我设置了一个detailview,因为我将把事件数据传递给detailview标签。我正在使用故事板分段。但我还不能完成它。有谁能帮我找到我缺少的东西吗

错误为“无法将“EKEvent”类型的值分配给“String”类型” 我应该将EKEvent日期类型转换为字符串吗?或者如何,我需要一个例子。我在练习我的快速技能

下面是我的代码

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var needPermissionView: UIView!
@IBOutlet weak var calendarsTableView: UITableView!
@IBOutlet weak var dateLabel: UILabel!

var event : [EKEvent]?
var calendars: [EKCalendar]?
let eventStore = EKEventStore()

override func viewDidLoad() {
    super.viewDidLoad()  
    loadEvents()

    calendarsTableView.delegate = self
    calendarsTableView.dataSource = self

    calendarsTableView.estimatedRowHeight = 44
    calendarsTableView.rowHeight = UITableViewAutomaticDimension

    calendarsTableView.reloadData()

}

    override func viewWillAppear(_ animated: Bool) {
    checkCalendarAuthorizationStatus()
}

    func checkCalendarAuthorizationStatus() {
    let status = EKEventStore.authorizationStatus(for: EKEntityType.event)

    switch (status) {
    case .notDetermined:
        requestAccessToCalendar()
    case .restricted, .denied:
        needPermissionView.fadeIn()
    case .authorized:
        loadCalendars()
        loadEvents()
        refreshTableView()
    }
}

func requestAccessToCalendar() {
    eventStore.requestAccess(to: .event) { (accessGranted, error) in
        if accessGranted == true {
            DispatchQueue.main.async {
                self.loadCalendars()
                self.loadEvents()
                self.refreshTableView()
            }
        } else {
            DispatchQueue.main.async {
                self.needPermissionView.fadeIn()
            }
        }
    }
}

func loadCalendars() {
    self.calendars = eventStore.calendars(for: EKEntityType.event)
}

func refreshTableView() {
    calendarsTableView.isHidden = false
    calendarsTableView.reloadData()
}

func loadEvents(){
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat =  "yyyy-MM-dd"

    let date = Date()
    let dateString = dateFormatter.string(from: date)

    print(dateString)
    dateLabel.text = dateString

    var components: DateComponents = DateComponents()
    components.setValue(1, for: .day)

    let expirationDate = Calendar.current.date(byAdding: components, to: date)
    //print(expirationDate ?? "expirationDate")

    let endString = dateFormatter.string(from: expirationDate!)

    // Create start and end date NSDate instances to build a predicate for which events to select
    let startDate = dateFormatter.date(from: dateString)
    let endDate = dateFormatter.date(from: endString)

    if let startDate = startDate, let endDate = endDate{
        let eventStore = EKEventStore()

        // Use an event store instance to create and properly configure an NSPredicate
        let eventsPredicate = eventStore.predicateForEvents(withStart: startDate, end: endDate, calendars: calendars)

        // Use the configured NSPredicate to find and return events in the store that match
        self.event = eventStore.events(matching: eventsPredicate).sorted(by: { (e1, e2) -> Bool in
            return e1.startDate.compare(e2.startDate) == ComparisonResult.orderedAscending
        })
    }
}

@IBAction func goToSettingsButtonTapped(_ sender: UIButton) {
    let openSettingsUrl = URL(string: UIApplicationOpenSettingsURLString)
    UIApplication.shared.openURL(openSettingsUrl!)
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if let events = self.event {
        return events.count
    }

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 90
    return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

    if let events = self.event {
        let eventName = events[(indexPath as NSIndexPath).row].title
        cell.textLabel?.text = eventName

        let eventDate = events[(indexPath as NSIndexPath).row].startDate
        let dateFormatter = DateFormatter()

        dateFormatter.dateFormat = "dd MMM yyyy  HH:mm"
        dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3")

        let timeStamp = dateFormatter.string(from: eventDate!)
        print(timeStamp)
        cell.detailTextLabel?.text = timeStamp
    } else {
        cell.textLabel?.text = "Unknown Calendar Name"
    }

    cell.textLabel?.numberOfLines = 0
    return cell
}

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let indexPath = calendarsTableView.indexPathForSelectedRow {
            let destVC = segue.destination as! DetailViewController
            destVC.taskNameLabel.text = event?[indexPath.row]
        }
    }
}

您的问题是
EKEvent
var无法分配给
text
类型为
String

destVC.taskNameLabel.text = event?[indexPath.row]
你需要

destVC.sendedEvent = event?[indexPath.row]
//


然后分配
sendeEvent
标题或
DetailViewController的
viewDidLoad
中的任何内容
。我理解这个问题,但我不知道如何解决它。根据你的答复,我做了更改。但我也遇到了同样的问题。“无法将类型“EKEvent!”的值分配给类型“String?”“我正在尝试将该事件数据输入到DetailViewController-Viewdidload方法:detailedLabel.text=SendeEventUse
detailedLabel.text=SendeEvent?。title
class DetailViewController {
  var sendedEvent: EKEvent?
}