我在故事板中设置了一个NSArrayController,我将模式设置为Entity Name,其名称为Client,并绑定了托管对象上下文,选择索引和排序描述符。我的NSPopupButton链接到那个数组控制器,当我运行时,我会看到我期望按钮上的所有元素。
现在我在代码中创建了一个强大的@IBOutlet,我正在尝试访问内容:
let objs = clientArrayController.arrangedObjects as! [Client]
print("I have \(objs.count) clients")
我在viewDidLoad
,viewWillAppear
和viewDidAppear
中尝试了该代码。他们都说0个客户。显然,这是不可能的,因为我在UI中显示客户端。
我在这里做错了什么?
答案 0 :(得分:0)
viewDidLoad
,viewWillAppear
和viewDidAppear
可能在数组控制器从核心数据存储中收集数据之前都被称为 - 因此它们(正确地)报告计数为零。要了解对阵列控制器的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)