首页 文章

如何将从核心数据获取的数据发送到另一个VC?

提问于
浏览
1

我是编程新手,我有一个使用核心数据的待办事项列表应用程序 . 用户输入信息,然后将其存储到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,其中数据将以标签显示 . 我的问题是,如何才能实现仅将单击的单元格中显示的数据传递给将更详细显示数据的视图控制器 .

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 回答

  • 1

    看看prepareForSegue

    讨论此方法的默认实现不执行任何操作 . 当需要将相关数据传递给新视图控制器时,视图控制器会覆盖此方法 . segue对象描述了转换,并包括对segue中涉及的两个视图控制器的引用 .

    这将为您提供一个引用两个视图控制器的方法,并允许您通过您定义的接受该数据的任何方法或属性将数据从源视图控制器传递到目标视图控制器 .

    在您的情况下,您可能需要跟踪源控制器上的选定单元格,并添加一个属性,该属性接受您在Core Data中定义的任何“todo”模型的标识符到目标控制器 .


    使用Core Data实体时,如何引用它们取决于它们的使用方式以及如何设置托管对象上下文 . 如果您的控制器共享一个托管对象上下文,那么您可以来回传递模型实例,因为您将在同一个上下文和同一个线程上工作 . 如果您的控制器使用(或可能想要使用)不同的上下文来隔离它们的更改,那么我更喜欢传递模型标识符并让每个控制器独立地加载相应的模型 . 这可能是不必要的开销,但我发现它也可以使控制器更容易重用和更改 .

相关问题