【问题标题】:Communicating with AppDelegate across scenes (Cocoa, swift)跨场景与 AppDelegate 通信 (Cocoa, swift)
【发布时间】:2015-09-08 15:46:27
【问题描述】:

在 Xcode 6(7 也是)中,我正在寻找如何获取 managedObjectContext 并在不同场景的 ViewController 中使用它。

  1. 我开始了一个新的 Cocoa 项目,点击了“使用 CoreData”
  2. 在 CoreData 中添加了一个实体,为其生成了一个 managedObject
  3. 添加了一个数组控制器,并将其绑定到实体
  4. 我想将数组控制器绑定到 managedObjectContext,但是我还想将 tableView(在我的视图控制器中)绑定到数组控制器。它们在不同的场景中,这似乎意味着不同的命名空间。

我尝试做的事情: 在 ViewController 中设置实例变量:

var managedObjectContext: NSManagedObjectContext!

viewDidAppear()我加了:

if let app = NSApplication.sharedApplication().delegate! as? AppDelegate {
    if let context = app.managedObjectContext{
        managedObjectContext = context
    } else {
        print("There was no context available, didn't work")
    }
}

然后我将表的列绑定到实体的属性。并且可可绑定自动完成,这意味着至少可以正确识别上下文。

但是,当我运行它时,它会默默地失败:“没有托管对象上下文就无法执行操作”。调试时上下文被设置为一个真实的对象,但我不知道它是否真的被初始化了。我查看了文档和可可绑定故障排除,但这似乎是核心数据问题。

(我看过这里:Getting managedObjectContext from AppDelegate 但我无法快速覆盖正常的初始化)

【问题讨论】:

    标签: swift cocoa core-data xcode6 cocoa-bindings


    【解决方案1】:

    我为你做了一个例子。我有一个Entity,称为Person,有2 个属性,nameage。这是我的ViewController

    import Cocoa
    
    class ViewController: NSViewController {
    
        // ManagedObjectContext from AppDelegate
        lazy var moc: NSManagedObjectContext = {
            let appDel = NSApplication.sharedApplication().delegate as! AppDelegate
            return appDel.managedObjectContext
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Populate some sample data
            let firstPerson = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: moc) as! Person
            firstPerson.name = "Jesse Pinkman"
            firstPerson.age = 25
    
        }
    }
    

    在 IB 中,我有一个表视图和一个数组控制器。将数组控制器的实体设置为Person:

    并且将数组控制器的托管对象上下文绑定到视图控制器的托管对象上下文,在我的示例中为self.moc

    然后将表格视图的列绑定到数组控制器。

    【讨论】:

    • 我收到“CoreData:警告:无法为实体“Person”加载名为“PRODUCT_MODULE_NAME.Person”的类。找不到类,使用默认的 NSManagedObjectInstead。
    • 我正在使用 Xcode 7 最新的 beta 版本,在你的 .xcdatamodels 实体设置中我有类:人员和模块:当前产品模块如果我没记错的话,使用什么语法有问题,这取决于无论您在子类中是否使用@objc
    【解决方案2】:

    对于它的价值,您可以绑定到 IB 中的 Application,模型密钥路径为 self.delegate.managedObjectContext。这是快速而肮脏的方式。

    有些人认为这很糟糕,主要是因为他们认为应用程序委托一开始就不应该拥有 MOC。我认为拥有核心数据堆栈的应用委托很好。

    但我警告说,这不是面向未来的。如果您想为 VC 创建一个子 MOC,并通过跳过保存来轻松“撤消”该场景中的所有本地更改,您最终将在 VC 上创建和维护 moc 属性。

    【讨论】:

    • 我是否可以将其设为 IBOutlet 来做到这一点?你能举个例子进一步澄清一下吗?
    • @jQwierdy - 做什么?要绑定到 IB 中的应用程序,您只需在 AC 的参数部分的“绑定到”下拉列表中选择“应用程序”。 IB 控件在另一个答案中进行了说明。
    猜你喜欢
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2018-10-21
    • 2014-05-08
    相关资源
    最近更新 更多