从 UITableView 选择行时将核心数据对象传递给另一个视图控制器

Posted

技术标签:

【中文标题】从 UITableView 选择行时将核心数据对象传递给另一个视图控制器【英文标题】:Passing Core Data objects to another view controller when selecting row from UITableView 【发布时间】:2016-01-25 02:00:33 【问题描述】:

根据提供的答案进行编辑:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    selectedName = quizNames[indexPath.row]
    performSegueWithIdentifier("saveSegue", sender: self)




    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "saveSegue" 
            let inputController = segue.destinationViewController as? QAInputViewController
            inputController?.quizName = selectedName 

        
    

我在这里做了一些研究,试图弄清楚如何使用 prepareForSegue 将选定的核心数据对象从 UITableView 单元格传递到第二个视图控制器,但是我发现并尝试实现的没有成功对我来说,似乎有些代码可能已经过时了。这是我想要做的:

    我用 Name 类型的名称数组填充 UITableView,这是我的 NSManagedObject。当我选择一个特定的名称时,它会将我转到一个输入屏幕,在该屏幕上将提交问题和答案。我想确保提交的问题和答案保持分配给先前选择的名称。我不确定如何在 prepareForSegue 中进行设置。我确实用关系建立了我的数据模型,所以如果我做得正确,一旦我了解如何实现它,它应该可以工作。有什么方法可以检查当前选择的名称,以便我知道输入的任何问题和答案都将保存到该名称中?

    相对于我上面的问题,我希望第二个视图控制器的标题显示之前选择的名称。

基本上,我只是在寻找在 Swift 2 中实现此功能的指导。非常感谢您的帮助。

编辑:Passing Core Data objects from UITableViewCell to another View Controller

上面的链接是我尝试实施但对我不起作用的解决方案。具体来说:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

    if segue.identifier == "showTaskDetail" 
        let detailVC: TaskDetailViewController = segue.destinationViewController as! TaskDetailViewController
        let indexPath = self.tableView.indexPathForSelectedRow()
        let thisTask = fetchedResultsController.objectAtIndexPath(indexPath!) as! TaskModel
        detailVC.detailTaskModel = thisTask
        detailVC.delegate = self

    

【问题讨论】:

“我发现并尝试过的东西”。你到底尝试了什么?你能告诉我们吗? 将使用我找到并尝试过的链接进行编辑 【参考方案1】:

这就是我的做法:

在我的班级顶部,我将有一个存储所选项目的 var:

var selectedTask: Task?

然后在我的tableViews didSelectRow 方法中:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    selectedTask = tasks[indexPath.row]
    performSegueWithIdentifier("showTaskDetail", sender: self)

最后:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

    if segue.identifier == "showTaskDetail" 
        let detailVC: TaskDetailViewController = segue.destinationViewController as! TaskDetailViewController
        detailVC.detailTaskModel = selectedTask
        detailVC.delegate = self
    

但是,我更倾向于只传递某种 ID/名称并使用新的 moc 执行另一次提取,而不是传递核心数据对象。

通过这种方式,您将减少线程问题,并且如果您需要深度链接到您的应用程序(例如通知或其他内容),这将使事情变得更加容易。

Mocs 很便宜,用过一次就扔掉。

【讨论】:

感谢@beau 的回复。我要试一试。如果我已经在使用数组来存储我的核心数据对象,我可以使用它而不是创建另一个 var 来存储所选项目吗?另外,我的detailVC中是否也需要一个var来存储所选项目?我已经看到在 SO 上的一些答案中实现了这一点 这完全取决于您将如何使用它。如果您的 detailVC 中有一个 var 会有所帮助,这样您就可以将对象传递到某个地方。如果您已经有一个数组,那也可以,只需存储选定的 indexPath(而不是“任务”)并使用它从数组中拉出您的对象,以便您可以将其传递给 detailVC。 谢谢。我所做的是把我的数组 selectedName = quizNames[indexPath.row] 这看起来正确吗?分配委托的最后一个名称行对我不起作用此外,我将核心数据对象分配给标题,以便显示名称,但是当它展开时我仍然得到 nil。不知道我做错了什么 您是否将整个对象分配给标题?还是核心数据对象的 title 属性?可能是愚蠢的问题。无论如何,如果它是 nil,那么您可能还没有设置它,这可能值得提出一个单独的问题。 ...只是一个更新。似乎我能够让它工作得有点乱。我摆脱了 didSelectRowAtIndexPath 函数并将 if let index = tableView.indexPathForSelectedRow?.row 添加到我的 prepareForSegue 函数中,加上 selectedName = quizNames[index] ,这似乎让它按我的预期工作。在我这样做之前它正在工作,问题是它推动了我的下一个 VC 两次,这很奇怪。不过现在似乎一切都很好。我很感激帮助。如果没有像你这样的人的指导,我会被卡住!谢谢

以上是关于从 UITableView 选择行时将核心数据对象传递给另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

选择 UITableView 中的行时如何清除文本字段?

在“UITableView”中选择行时调用新视图

从 UITableView 插入和删除行时如何正确更新数据源?

Swift-app 在 UITableView 中选择行时崩溃

将 UITableView 添加到现有项目:添加数组以填充行时崩溃

选择行时 UITableView 崩溃