如何从CoreData关系设置UItableView数据源。

时间:2016-06-04 15:11:45

标签: ios swift uitableview core-data

我的coredata关系获取请求返回NSSet对象。如何在无序集中为NSset设置tableview数据源的数据。我可以将NSSet转换为NSArray,但它会以相同的顺序返回数据。

1 个答案:

答案 0 :(得分:0)

Apple is clear"数组中对象的顺序是未定义的。"所以我希望它可以改变。

我建议您将allObjects数组存储到实例变量中,并使用它来实现numberOfSectionsInTableView()和其他数据源方法。

您还可以将NSFetchedResultsController存储在实例变量中,并安全地使用它:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var rows = 0
    if self.fetchedResultsController!.sections!.count > 0 {
        let sectionInfo = getSectionInfo(section)
        rows = sectionInfo!.numberOfObjects
    }
    return rows
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    let sectionInfo = getSectionInfo(section)
    return sectionInfo!.name
}

func getSectionInfo(section: Int) -> NSFetchedResultsSectionInfo? {
    var sections: [AnyObject] = self.fetchedResultsController!.sections!
    if section < sections.count {
        let x = sections[section] as! NSFetchedResultsSectionInfo
        return x
    }
    return nil
}

override func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
    return self.fetchedResultsController!.sectionForSectionIndexTitle(title, atIndex: index)
}

override func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
    return self.fetchedResultsController!.sectionIndexTitles
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("YourCellIdentifier")! as UITableViewCell

    // Use your own NSManagedObject class here...mine is Category
    let category = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Category
    return cell
}

我个人已经在我重用的基类中编写了所有上述方法,因此我可以在每个新的表视图中实现cellForRowAtIndexPath()。我发布了a copy on github,以防它可能对其他人有用。