根据标题,当我尝试从viewDidLoad()打印数据时,阵列控制器中不存在任何内容。但是,当我从其中一个tableview方法打印数据时,那里有一些东西。那么我可以使用viewcontroller类中的方法来检查tableview及其数据何时完成加载?
class ViewController: NSViewController {
@IBOutlet var alarmArrayController: NSArrayController!
}
ArrayController在ViewController的XCode中的属性
ArrayController在XCode for ViewController中的Cocoa绑定
我有这段代码来打印我的阵列控制器。
for object in alarmArrayController.arrangedObjects as! [Alarm] {
print(object)
alarmArrayController.removeObject(object)
}
它适用于以下可查看方法
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
但不在viewDidAppear()或viewDidLoad()
中答案 0 :(得分:0)
您可以将控制器设为NSFetchedResultsControllerDelegate。 “一种委托协议,描述了当提取结果发生变化时,相关的提取结果控制器将调用的方法。” (Apple docs)
让您的班级符合协议:
class YourViewController: UITableViewController, NSFetchedResultsControllerDelegate
创建数据提供程序对象时将自己设置为委托:
provider.fetchedResultsControllerDelegate = self
最后,创建一个类扩展,如下所示。
extension YourViewController {
func controllerDidChangeContent(_ controller:
NSFetchedResultsController<NSFetchRequestResult>) {
tableView.reloadData()
}
}
答案 1 :(得分:0)
好。所以我在更新帖子时找到了答案。
我意识到在viewcontroller生命周期的某个时刻,数据是通过Cocoa绑定从核心数据加载到我的数组控制器。在这个生命周期的哪个阶段我不知道。更糟糕的是我正在查看UIViewController生命周期的文档,而不是NSViewController。
NSViewController似乎不同 的UIViewController https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html
NSViewController https://developer.apple.com/documentation/appkit/nsviewcontroller
正如我们所看到的,对于NSViewController,viewDidAppear()中有其他附加阶段,这些是
updateViewConstraints()
viewWillLayout()
viewDidLayout()
在调用viewDidLayout()方法之前,似乎没有加载数据