NSFetchedResultsSectionInfo изменяет раздел при сообщении делегата MOVE - PullRequest
0 голосов
/ 11 марта 2020

Вариант использования прост:

список ToDo (= NSManagedObject), отображаемый в таблице (NSOutlineView), где пользователь может щелкнуть заголовок столбца, чтобы отсортировать по выбранному столбцу. Если пользователь сортирует по столбцу date (= date - первый sortDescriptor), NSFetchedResultsController генерирует один раздел в месяц (через атрибут monthDate ToDo)

Вот это fetchDataModel() функция:

let fetchRequest = NSFetchRequest<Expense>(entityName: "ToDo")
fetchRequest.predicate = predicate
// Configure the request's entity, and optionally its predicate
let keyPath = #keyPath(ToDo.monthDate)

if self.shouldDisplayGroups() { // = first sort descriptor is 'date'
    withSections = true
    sortDescriptors.insert(NSSortDescriptor(key: keyPath, ascending: outlineView.sortDescriptors[0].ascending), at: 0)
}

if self.frc != nil {
    NSFetchedResultsController<NSFetchRequestResult>.deleteCache(withName: "MyAppCacheID")
}
self.frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: withSections ? keyPath : nil, cacheName: "MyAppCacheID")
self.frc.delegate = self
do {
    try self.frc.performFetch()
} catch {
    fatalError("Failed to fetch entities: \(error)")
}

Существует проблема, если выполняются следующие условия:

  • Текущие первые дескрипторы sortDescriptors находятся в 'date', поэтому секции отображаются
  • Пользователь изменяет одну строку (ToDo), которая является единственной в своем разделе и не должна изменять раздел после изменения!
  • Измененный атрибут является частью массива sortDescriptors представления, которое таким образом вызывает изменение ПЕРЕМЕЩЕНИЯ на NSFetchedResultsControllerDelegate. Пример: пользователь изменяет описание. Это следует из документации, которая гласит:

О перемещении сообщается, когда измененный атрибут объекта является одним из дескрипторов сортировки, используемых в запросе на выборку.

В этом конкретном c случае, как ни странно, раздел (NSFetchedResultsSectionInfo) измененного ToDo изменяется и получает новую ссылку, даже если старые и новые разделы имеют абсолютно одинаковое значение. Поскольку я обрабатываю MOVE путем удаления и добавления, это вызывает проблемы с отображением, поэтому я не могу правильно обновить таблицу (NSOutlineView). Кроме того, делегат НЕ сообщает об изменении раздела , поэтому я не могу просто справиться с этим путем изменения раздела.

Почему это происходит? И почему, когда в разделе есть только один предмет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...