如何使用NSFetchedResultsController创建字母部分标题 - Swift 3

时间:2017-07-26 03:45:06

标签: ios uitableview sorting swift3 nsfetchedresultscontroller

我正在使用NSFetchedResultsController来填充tableView。 tableView可以很长,因为它显示了一个人的列表,我想按字母顺序对它进行排序。我知道我需要使用titleForHeaderInSection,但我仍然坚持如何获取fetchedObjectsController.fetchedObjects中每个对象的第一个字母,并将其显示为节标题以及对其进行排序,以及如何对其进行排序应用程序工作。

这就是我的View Controller的样子。

var fetchedResultsController: NSFetchedResultsController<Client> = {
    let fetchRequest: NSFetchRequest<Client> = Client.fetchRequest()
    let sortDescriptors = [NSSortDescriptor(key: "name", ascending: false)]
    fetchRequest.sortDescriptors = sortDescriptors
    return NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: CoreDataStack.context, sectionNameKeyPath: "name", cacheName: nil)
}()

override func numberOfSections(in tableView: UITableView) -> Int {
    guard let sections = fetchedResultsController.sections else { return 0 }
    return sections.count
}


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let sections = fetchedResultsController.sections else { return 0 }
    return sections[section].numberOfObjects
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "clientCell", for: indexPath)
    let client = fetchedResultsController.object(at: indexPath)
    cell.textLabel?.text = client.name

    return cell
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        let client = fetchedResultsController.object(at: indexPath)
        ClientController.sharedController.delete(client)
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个很小的示例,说明如何获取标题文本,我只使用一个类进行仅具有名称的测试,然后使用map应用characters.prefix我们得到的第一个字符名称和转换为String并排序后我们有你需要的东西

var arrayOfUsers : [User] = [User(name:"test"),User(name:"pest"),User(name:"aest"),User(name:"nest"),User(name:"best")]
let finalArray = arrayOfUsers.map({String.init($0.name.characters.prefix(1)) }).sorted(by: {$0 < $1})
debugPrint(finalArray)

控制台日志结果

  

[“a”,“b”,“n”,“p”,“t”]

希望这有助于你