如何将从核心数据获取的数据发送到另一个 VC?
Posted
技术标签:
【中文标题】如何将从核心数据获取的数据发送到另一个 VC?【英文标题】:How can I send data fetched from core data to another VC? 【发布时间】:2015-01-12 23:30:49 【问题描述】:我是编程新手,我有一个使用核心数据的待办事项列表应用程序。用户输入信息,然后将其存储到 coreData 数据库中。在我的 UITableView 中,我创建了一个获取请求并将数据存储到一个数组中,代码如下所示。
var tasks: Array<AnyObject> = []
override func viewDidAppear(animated: Bool)
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let contexts: NSManagedObjectContext = appDeleg.managedObjectContext!
let fetchreq = NSFetchRequest(entityName: "toDo")
tasks = contexts.executeFetchRequest(fetchreq, error: nil)!
tableView.reloadData()
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let CellID: NSString = "myCell"
var cell: CustomCell = tableView.dequeueReusableCellWithIdentifier(CellID) as CustomCell
if let indexpth = indexPath as NSIndexPath!
var data: NSManagedObject = tasks[indexpth.row] as NSManagedObject
cell.theTextLabel?.text = data.valueForKeyPath("toDoName") as? String
cell.theDetailTextLabel?.text = data.valueForKeyPath("toDoNumber") as? String
在表格视图中显示数据效果很好,但我想让一些事情稍微复杂一些。当用户单击一个单元格时,我想创建一个推送 segue 到另一个 VC,其中数据将显示在标签中。我的问题是,我怎样才能实现仅将单击的单元格中显示的数据传递给将更详细地显示数据的视图控制器。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "showDetail"
var detailVC: DetailViewController = segue.destinationViewController as DetailViewController
var index: NSIndexPath = self.tableView.indexPathForSelectedRow()! //Index path for cell
var row: NSInteger = index.row // Converting NSIndexPath to int
var theData: NSManagedObject = tasks[row] as NSManagedObject
//here I would pass info from theData to the DetailViewController
detailVC.theObjectImPassingTo = theData
问题是我不知道如何传递该数据,因此它会保持托管对象的形式,以及我需要在 DetailViewController 中使用哪种变量来存储数据。我试过了几件事,但我有限的经验不足以弄清楚。
【问题讨论】:
【参考方案1】:看看prepareForSegue
讨论 此方法的默认实现什么也不做。当您的视图控制器需要将相关数据传递给新的视图控制器时,它会覆盖此方法。 segue 对象描述了转换,并包括对 segue 中涉及的两个视图控制器的引用。
这将为您提供一个引用两个视图控制器的方法,并允许您通过您定义的任何方法或属性将数据从源视图控制器传递到目标视图控制器以接受该数据。
在您的情况下,您可能需要跟踪源控制器上选定的单元格,并添加一个属性,该属性接受您在 Core Data 中定义的任何“待办事项”模型的标识符到目标控制器。
在使用 Core Data 实体时,您如何引用它们取决于它们的使用方式以及您如何设置托管对象上下文。如果您的控制器共享一个托管对象上下文,那么您可以来回传递模型实例,因为您将在同一上下文和同一线程中工作。如果您的控制器使用(或可能想要使用)不同的上下文来隔离它们的更改,那么我更喜欢传递模型标识符并让每个控制器独立加载相应的模型。这可能是不必要的开销,但我发现它还可以使控制器更容易重用和更改。
【讨论】:
感谢乔纳的回答!我已经编辑了我的代码以添加为 segue 方法做准备。我应该提到我知道如何使用 prepareForSegue 方法将数据从一个 vc 传递到另一个,但我只知道如何传递普通数据,我不熟悉传递 CoreData 信息以及我会丢弃什么样的对象DetailViewController 中的数据。干杯! 我添加了一些关于引用 Core Data 实体的 cmets,希望有用。有没有更具体的我可以回答? 现在我很好,我会尝试使用你们的 cmets 自己找到解决方案,这样我就可以学习,如果我遇到太多麻烦并且无法解决我的问题我会回到这里寻求更多帮助...谢谢!以上是关于如何将从核心数据获取的数据发送到另一个 VC?的主要内容,如果未能解决你的问题,请参考以下文章
将数据发送到另一个 ViewController 的 Swift 问题
将 collectionView 数据发送到另一个视图控制器中的网点
如何通过ajax fetch api响应将从laravel控制器接收到的数据发送到另一个页面
如何将从数据库接收到的数据作为道具传递给 Reactjs 中的另一个组件