Ios 当选择行时,尝试将核心数据从表视图传递到新视图-不断出现错误

Ios 当选择行时,尝试将核心数据从表视图传递到新视图-不断出现错误,ios,swift,core-data,segue,tableviewcell,Ios,Swift,Core Data,Segue,Tableviewcell,我已经做了一段时间了——我正在尝试将数据从使用核心数据的UITableView单元传递到新视图。我在prepare for Segue代码中尝试了许多不同的变量,但一直在使用未解决的标识符错误-请参阅下面的代码-我缺少什么 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cellIdentif

我已经做了一段时间了——我正在尝试将数据从使用核心数据的UITableView单元传递到新视图。我在prepare for Segue代码中尝试了许多不同的变量,但一直在使用未解决的标识符错误-请参阅下面的代码-我缺少什么

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "myEventsCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyEventsTableViewCell

    let eventData = myEvents [indexPath.row]
    cell.eventNameLabel.text = "Name: " + eventData.eventName
    cell.startDateLabel.text = "Start: " + eventData.startDate
    cell.endDateLabel.text = "End: " + eventData.endDate

    cell.backgroundColor = UIColor.clearColor()

    return cell
}

override func prepareForSegue (segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "showEventDetails" {
        if let indexPath = self.tableView.indexPathForSelectedRow() {
            let destinationController = segue.destinationViewController as eventDetailView
            destinationController.eventNameLabel.text = "Name: " + eventData.eventName [indexPath.row]
            destinationController.eventStartLabel.text = "Start: " + eventData.startDate [indexPath.row]
            destinationController.eventEndLabel.text = "End: " + eventData.endDate [indexPath.row]
            destinationController.eventDetailLabel.text = eventData.details [indexPath.row]
        }
    }
}

您的segue如何知道要传输的对象?您没有以如下方式调用对象:

  let thisTask = fetchedResultsController.objectAtIndexPath(indexPath!)    as YOUROBJECT
或者,如果不使用NSFetchedResultController,则使用其他方法—例如:让eventData=myEvents[indexPath]

不知道您的模型是什么样子的,所以它可能不太精确……但肯定无法告诉序列它是哪个对象。

什么是eventData:

如果上面的代码有效,为什么不再次使用该构造

let eventData = myEvents [indexPath.row]
然后

    destinationController.eventNameLabel.text = "Name: " + eventData.eventName
    /* code */

要访问目标控制器的值?

由于您没有发布错误,我不知道这是否是导致错误的原因,但您不能像尝试那样在目标控制器中设置标签文本。在调用prepareForSegue时,目标控制器已实例化,但其视图尚未加载。因此,其网点将为零。您应该在目标视图控制器中创建字符串属性,并将字符串传递给它。在viewDidLoad中填充标签。

我认为您的错误与PrepareForsgue中未定义eventData有关。将数据从选定单元传递到局部视图控制器的更好方法如下:

// I assume you have an existing class eventData
class EventData {
    var eventName: String!
    // other properties
}

class MyEventsTableViewCell: UITableViewCell {

    @IBOutlet var eventNameLabel: UILabel!
    // other outlets

    // Add this property to your tableview cell
    // Now your cell has a direct reference to the eventData, we will use that in the prepareForSegue function
    var eventData: EventData! {
        didSet {
            eventNameLabel.text = "Name: " + eventData.eventName
            // other properties
        }
    }

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "myEventsCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyEventsTableViewCell

    let eventData = myEvents [indexPath.row]

    // Here you can set the eventData for the cell, this will automatically set the outlets.
    cell.eventData = eventData

    cell.backgroundColor = UIColor.clearColor()

    return cell
}



override func prepareForSegue (segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "showEventDetails" {
        // The sender parameter represents the selected cell
        let selectedCell = sender! as MyEventsTableViewCell
        // now we have a reference to the eventData for this selected cell
        let eventData = selectedCell.eventData

        let destinationController = segue.destinationViewController as eventDetailView
        // we pass the eventData to the destinationController (you will have to add a eventData property to the destinationController)
        destinationController.eventData = eventData

    }
}
正如@rdelmar所解释的,您不应该直接访问destinationController的出口。而是为eventData创建一个属性。加载destinationController视图时,可以使用该属性设置局部视图的出口


还有一个命名建议:目标控制器的类名为eventDetailView。这令人困惑,因为它不是视图,而是viewcontroller。我建议将其重命名为EventDetailViewController或类似您喜欢的名称。

不要解释错误;将实际错误粘贴到问题中。如果你知道的话,也告诉我们你从哪里得到错误的哪一行。谢谢Peter,这非常有帮助-我想我很接近了-但是我相信我现在在eventDetailView中遗漏了一些东西。您提到在那里设置属性,我已经做了,但现在不确定我还缺少什么-我在单击我的详细视图时出错,该视图显示dynamiccastClass Unconditional这可能是一个无关的问题,因为直到现在,由于之前的错误,您还没有做到这一点。这是一个没有代码的猜测,但是有一些东西需要检查。故事板中的类名是否与detailVC的类名匹配?如果出现detailVC,它是否显示正确的事件数据?这可能会变得复杂,但我会尝试解释-我有一个tableview控制器-其中我有一个标题视图-此标题视图是我试图填充此数据作为目标的-因此它实际上不是一个视图控制器,而是tableviewcontroller-我已将视图的类设置为类名-tableviewcontroller尚未编码,因此仍被分类为UITableVIewController-我尝试使用segue代码转到视图而不是视图控制器,这是可能的吗?若否,有何建议??提前感谢tableview的目的是将用户导航到他们创建的事件的详细信息,在其中捕获用户输入的评论、照片、签入等。我将使用原型单元格来获取这些信息-这就是为什么我试图将事件详细信息名称、开始和结束日期作为标题捕获到视图中。本例中的源控制器是tableviewcontroller,它列出了用户创建的具有名称和日期的事件
// I assume you have an existing class eventData
class EventData {
    var eventName: String!
    // other properties
}

class MyEventsTableViewCell: UITableViewCell {

    @IBOutlet var eventNameLabel: UILabel!
    // other outlets

    // Add this property to your tableview cell
    // Now your cell has a direct reference to the eventData, we will use that in the prepareForSegue function
    var eventData: EventData! {
        didSet {
            eventNameLabel.text = "Name: " + eventData.eventName
            // other properties
        }
    }

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "myEventsCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyEventsTableViewCell

    let eventData = myEvents [indexPath.row]

    // Here you can set the eventData for the cell, this will automatically set the outlets.
    cell.eventData = eventData

    cell.backgroundColor = UIColor.clearColor()

    return cell
}



override func prepareForSegue (segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "showEventDetails" {
        // The sender parameter represents the selected cell
        let selectedCell = sender! as MyEventsTableViewCell
        // now we have a reference to the eventData for this selected cell
        let eventData = selectedCell.eventData

        let destinationController = segue.destinationViewController as eventDetailView
        // we pass the eventData to the destinationController (you will have to add a eventData property to the destinationController)
        destinationController.eventData = eventData

    }
}