简体   繁体   English

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

[英]Swift : UITableView Passing Calendar Event Data to DetailViewController

I have a tableview, which loads the calendar events into rows dynamically. 我有一个tableview,它将日历事件动态加载到行中。 I'am checking for device's current day events. 我正在检查设备的当日活动。 I set a detailview because I will pass that event data to the detailview labels. 我设置了一个detailview,因为我会将事件数据传递到detailview标签。 I am using storyboard segues. 我正在使用情节提要剧集。 But I could not complete it yet. 但是我还不能完成。 Can anyone help me what I am missing? 谁能帮我我所缺少的吗?

The error is "Cannot assign value of type 'EKEvent?' 错误为“无法分配'EKEvent类型的值?' to type 'String?'" Should I convert the EKEvent Date type to the string? 键入“字符串?””我是否应该将EKEvent日期类型转换为字符串? or How, I need an example for that. 或如何,我需要一个例子。 I am practicing my swift skills. 我正在练习快速技能。

Here is my code below; 这是下面的代码;

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]
        }
    }
}

Your problem is here EKEvent var can't be assigned to text which is of type String 您的问题是这里EKEvent var无法分配给String类型的text

destVC.taskNameLabel.text = event?[indexPath.row]

you need to 你需要

destVC.sendedEvent = event?[indexPath.row]

// //

class DetailViewController {
  var sendedEvent: EKEvent?
}

Then assign sendedEvent title or anything inside viewDidLoad of DetailViewController 然后分配sendedEvent标题或DetailViewController viewDidLoad内部的任何内容

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

相关问题 快速将TableView数据传递给DetailViewController - Passing TableView Data to DetailViewController in swift 在Swift中从视图控制器之间传递数据(从TableView到DetailViewController) - Passing data between View Controllers in Swift (From TableView to DetailViewController) 在DetailViewController Swift中更改数据 - Change data in DetailViewController Swift Swift-CoreData-DetailViewController-传递对象 - Swift - CoreData - DetailViewController - passing an object 将数据从UITableView单元传递到另一个VC的UITableView? (迅速) - Passing data from a UITableView cell to another VC's UITableView? (Swift) 来自UITableViewController的按钮将数据发送到detailViewController - swift - Button from UITableViewController sends data to detailViewController - swift 搜索结果未在DetailViewController中显示正确的数据(Swift 3) - Search results not showing right data in DetailViewController (Swift 3) Swift - UITableView滚动事件 - Swift - UITableView scroll event 使用 Swift 和 Firebase 中的协议从 UITableview 传递数据 - Passing data from UITableview using Protocol in Swift and Firebase SWIFT:UITableView将所有单元格的数据(TextField和Label)传递到UIViewController - SWIFT : UITableView passing all cell's data(TextField & Label) to UIViewController
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM