Swift - ArrayController,什么时候填充数据?

时间:2018-05-27 21:14:18

标签: swift uitableview nsarraycontroller

根据标题,当我尝试从viewDidLoad()打印数据时,阵列控制器中不存在任何内容。但是,当我从其中一个tableview方法打印数据时,那里有一些东西。那么我可以使用viewcontroller类中的方法来检查tableview及其数据何时完成加载?

class ViewController: NSViewController {
    @IBOutlet var alarmArrayController: NSArrayController!
}

ArrayController在ViewController的XCode中的属性

Array Controller in XCode

ArrayController在XCode for ViewController中的Cocoa绑定 ArrayController's Cocoa Bindings In XCode For ViewController

我有这段代码来打印我的阵列控制器。

for object in alarmArrayController.arrangedObjects as! [Alarm] {
    print(object)
    alarmArrayController.removeObject(object)
}

它适用于以下可查看方法

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?

但不在viewDidAppear()或viewDidLoad()

2 个答案:

答案 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()方法之前,似乎没有加载数据