Swift - ArrayController, когда он заполняется данными? - PullRequest
0 голосов
/ 28 мая 2018

В соответствии с заголовком, когда я пытаюсь распечатать данные из viewDidLoad (), в контроллере массива ничего не присутствует.Но когда я печатаю данные из одного из методов табличного представления, там что-то есть.Так есть ли метод, который я могу использовать из класса viewcontroller, чтобы проверить, когда таблица и ее данные закончили загрузку?

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

Атрибуты ArrayController в XCode для ViewController

Array Controller in XCode

Привязки какао ArrayController в XCode для ViewController 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 голосов
/ 28 мая 2018

Хорошо.Поэтому я нашел свой ответ, когда обновлял свое сообщение.

Я понял, что в какой-то момент жизненного цикла viewcontroller данные загружаются из базовых данных в мой контроллер массива с привязками Какао.На какой стадии в течение этого жизненного цикла я понятия не имел.Хуже всего то, что я просматривал документы по жизненному циклу UIViewController, а не NSViewController.

NSViewController, который выглядит как другой UIViewController https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html

NSViewController https://developer.apple.com/documentation/appkit/nsviewcontroller

Как мы видим, есть дополнительные этапы в viewDidAppear () для NSViewController, это

updateViewConstraints()
viewWillLayout()
viewDidLayout() 

Кажется, данные не загружаются, пока не будет вызван метод viewDidLayout ()

0 голосов
/ 28 мая 2018

Вы можете сделать свой контроллер NSFetchedResultsControllerDelegate.«Протокол делегата, который описывает методы, которые будут вызываться соответствующим контроллером извлеченных результатов, когда результаты извлечения изменились».(Apple Docs)

Ваш класс должен соответствовать протоколу:

class YourViewController: UITableViewController, NSFetchedResultsControllerDelegate

Установите себя в качестве делегата при создании объекта поставщика данных:

provider.fetchedResultsControllerDelegate = self

Наконец,создайте расширение класса, как показано ниже.

extension YourViewController {

    func controllerDidChangeContent(_ controller:
         NSFetchedResultsController<NSFetchRequestResult>) {
            tableView.reloadData()
        }
    }
...