使用NSFetchedResultsController时如何获取节名,sectionNameKeyPath是一种关系?

时间:2011-08-31 00:09:53

标签: iphone nsfetchedresultscontroller sectionheader

在以下代码中:

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

sectionNameKeyPath的@“store”值实际上指向一个Store实体的关系,该实体具有我真正需要的name属性作为我的节标题标题。

但是我的代码设置方式无法完成,因为我改为获得以下部分标题: 0x5b504f0 0x5b51190 就我所知,Store对象的代码数据地址是哪个。

如何使用NSFetchedResultsController以便我可以告诉它我希望它从sectionNameKeyPath获取其名称属性:@“store”?或者还有其他一些解决方法吗?

2 个答案:

答案 0 :(得分:5)

尝试sectionNameKeyPath:@"store.name"

答案 1 :(得分:1)

我知道这是一个旧线程,但我想使用Swift添加我的解决方案。

我必须建议此解决方案取决于NSFetchedResultsController返回的部分名称的格式,因此它取决于Apple可以更改的内部实现。

节名称包含持久数据存储中对象ID的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),但你明白了。