何时是Cocoa绑定'set'

时间:2016-05-31 22:53:30

标签: cocoa nsarraycontroller

我在故事板中设置了一个NSArrayController,我将模式设置为Entity Name,其名称为Client,并绑定了托管对象上下文,选择索引和排序描述符。我的NSPopupButton链接到那个数组控制器,当我运行时,我会看到我期望按钮上的所有元素。

现在我在代码中创建了一个强大的@IBOutlet,我正在尝试访问内容:

let objs = clientArrayController.arrangedObjects as! [Client]
print("I have \(objs.count) clients")

我在viewDidLoadviewWillAppearviewDidAppear中尝试了该代码。他们都说0个客户。显然,这是不可能的,因为我在UI中显示客户端。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

viewDidLoadviewWillAppearviewDidAppear可能在数组控制器从核心数据存储中收集数据之前都被称为 - 因此它们(正确地)报告计数为零。要了解对阵列控制器的arrangedObjects数组所做的任何更改,您可以使用上述方法之一安装观察此对象并报告所有更改的观察者:

// MyPopUpController.swift

var ArrayControllerArrangedObjectsObservationContext = "arrayController.arrangedObjects"


func viewDidLoad() {
    arrayController.addObserver(self, 
        forKeyPath: "arrangedObjects", 
        options: .New | .Old, 
        context: &ArrayControllerArrangedObjectsObservationContext)
}

您有机会回复observeValueForKeyPath...

中的更改
// MyPopUpController.swift

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
    switch context {
        case &ArrayControllerArrangedObjectsObservationContext:
            // Check counts here
        default:
            super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
}

如果您在启动时只需要观察者,在检查了计数后,做了您需要做的任何事情,那么您应该删除观察者:

// MyPopUpController.swift

arrayController.removeObserver(self, 
    forKeyPath: "arrangedObjects", 
    context: &ArrayControllerArrangedObjectsObservationContext)