将核心数据对象从 DetailViewController 传递到另一个 View Controller

Posted

技术标签:

【中文标题】将核心数据对象从 DetailViewController 传递到另一个 View Controller【英文标题】:Passing Core Data objects from DetailViewController to another View Controller 【发布时间】:2016-08-19 15:47:40 【问题描述】:

有没有办法将 Core Data 对象从 DetailViewController 传递到另一个 View Controller 以允许编辑?

从 MasterViewController 导航到 DetailViewController:

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "showDetail" 
            if let indexPath = self.tableView.indexPathForSelectedRow 
                let myValue = myValues[indexPath.row]
                let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
                controller.detailItem = myValue
                controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
                controller.navigationItem.leftItemsSupplementBackButton = true
            
        
    

然后从 DetailViewController 到 EditViewController:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "showEdit" 

            let controller =  editViewController
            controller.editItem = detailItem
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
            controller.navigationItem.leftItemsSupplementBackButton = true


        

    

但我的对象是 nil

编辑

EditViewController上的编辑Item是这样设置的:

var editItem: MyValues? 
        didSet 
            // Update the view.

            self.configureView()
        
    

而detailItem在DetailViewController中是这样设置的:

var detailItem: MyValues? 
        didSet 
            // Update the view.
            self.configureView()
        
    

【问题讨论】:

【参考方案1】:

不要使用编辑控制器的属性,而是使用从 segue 中获得的内容。

即(假设您直接移动到您的 EditViewController):替换...

let controller =  editViewController

...类似...

let controller = segue.destinationViewController as! EditViewController

...除了你应该测试它而不是使用as!

===

更新我对这是怎么回事的猜测。 (见 cmets。)

您必须在代码中某处创建了 editViewController 指向的任何内容,这意味着它与作为 segue 机制的一部分为您创建的实例/对象不同。换句话说,您有两个不同的 EditViewController 对象,并且您没有将数据传递给将在屏幕上放置视图的对象。

【讨论】:

谢谢。这似乎可以解决问题。但是为什么我的代码不起作用? 您必须在代码中某处创建了 editViewController 指向的任何内容,这意味着它与作为 segue 机制的一部分为您创建的实例/对象不同。换句话说,您有两个不同的 EditViewController 对象,并且您没有将数据传递给将在屏幕上放置视图的对象。 感谢您的回答,但主要是为了解释!我可以要求将此添加到您的答案中以供其他人参考吗?你也是对的,我把它(editViewController)创建为我的类中的一个变量......

以上是关于将核心数据对象从 DetailViewController 传递到另一个 View Controller的主要内容,如果未能解决你的问题,请参考以下文章

将核心数据对象从 DetailViewController 传递到另一个 View Controller

核心数据:将对象从一个持久存储移动到另一个

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

从核心数据中检索特定对象

如何在 swift 3 中从核心数据中删除对象

使用 NSArray 从 iOS 上的可转换核心数据创建对象