Как получить имя раздела при использовании NSFetchedResultsController и sectionNameKeyPath это отношение? - PullRequest
5 голосов
/ 31 августа 2011

В следующем коде:

NSFetchedResultsController *frc =
[[NSFetchedResultsController alloc]
 initWithFetchRequest:fetchRequest
 managedObjectContext:myManagedObjectContext
 sectionNameKeyPath:@"store"
 cacheName:@"SomeCache"
 ];

Значение @ "store" для sectionNameKeyPath фактически указывает на связь с сущностью Store, имеющей атрибут name, который мне действительно нужен в качестве заголовка заголовка раздела.

Но то, как мой код настроен, не может быть выполнено, так как вместо этого я получаю заголовки разделов, такие как: 0x5b504f0 0x5b51190 Насколько я могу судить, какие адреса кодовых данных для объекта Store выбираются?

Как я могу использовать NSFetchedResultsController, чтобы я мог сказать ему, что я хочу, чтобы он извлекал атрибут name из того, что он выбирает из sectionNameKeyPath: @ "store"? Или есть какой-то другой обходной путь?

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

Попробуйте sectionNameKeyPath:@"store.name"

1 голос
/ 11 июля 2016

Я знаю, что это старая ветка, но я хотел бы добавить свое решение с помощью Swift.

Я должен сообщить, что это решение зависит от формата имени раздела, возвращаемого NSFetchedResultsController, поэтомуэто зависит от внутренних реализаций, которые могут быть изменены Apple.

Имя раздела содержит URI идентификатора объекта в постоянном хранилище данных, поэтому вы можете получить объект, сначала извлекая URI, а затем запрашивая Storeдля объекта с соответствующим URI

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    let sectionInfo = fetchedResultsController?.sections![section]
    let sectionName = sectionInfo?.name

    //This part depends on the internal implementation of sectionInfo.name
    let initialRange = sectionName?.rangeOfString("<")
    let finalRange = sectionName?.rangeOfString(">")

    let uri = sectionName?.substringWithRange((initialRange?.endIndex)!..<(finalRange?.startIndex)!)
    let url = NSURL(string: uri!)

    let store = fetchedResultsController?.managedObjectContext.persistentStoreCoordinator

    let objectID = store?.managedObjectIDForURIRepresentation(url!)
    let coreObject = fetchedResultsController?.managedObjectContext.objectWithID(objectID!)
    //return the correct property from the object as the title
    let title = ...
    return title
}

Ну, вам нужно проверить на ошибки (я бы использовал guard перед этими let), но вы поняли.

...