我是编程新手,我有一个使用核心数据的待办事项列表应用程序。用户输入信息,然后将其存储到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
}
在表格视图中显示数据非常有效,但我想做一些稍微复杂的事情。当用户点击一个单元格时,我想创建一个push segue到另一个VC,其中数据将以标签显示。我的问题是,如何才能实现仅将单击的单元格中显示的数据传递给将更详细显示数据的视图控制器。
覆盖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中需要哪种变量来存储数据。我试过了很少的事情,但我的有限经验还不足以弄明白。
答案 0 :(得分:1)
讨论 此方法的默认实现不执行任何操作。当需要将相关数据传递给新视图控制器时,视图控制器会覆盖此方法。 segue对象描述了转换,并包含对segue中涉及的两个视图控制器的引用。
这将为您提供一个引用两个视图控制器的方法,并允许您通过您定义的接受该数据的任何方法或属性将数据从源视图控制器传递到目标视图控制器。
在您的情况下,您可能需要跟踪源控制器上的所选单元格,并添加一个属性,该属性接受任何&#34; todo&#34;您在Core Data中定义到目标控制器的模型。
使用Core Data实体时,如何引用它们取决于它们的使用方式以及如何设置托管对象上下文。如果您的控制器共享一个托管对象上下文,那么您可以来回传递模型实例,因为您将在同一个上下文和同一个线程上工作。如果您的控制器使用(或可能想要使用)不同的上下文来隔离它们的更改,那么我更喜欢传递模型标识符并让每个控制器独立地加载相应的模型。这可能是不必要的开销,但我发现它也可以使控制器更容易重用和更改。