Ios 当选择行时,尝试将核心数据从表视图传递到新视图-不断出现错误
我已经做了一段时间了——我正在尝试将数据从使用核心数据的UITableView单元传递到新视图。我在prepare for Segue代码中尝试了许多不同的变量,但一直在使用未解决的标识符错误-请参阅下面的代码-我缺少什么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
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
}
}