如何使用 NSFetchedResultsController 创建字母部分 headers - Swift 3
How to create alphabetical section headers with NSFetchedResultsController - Swift 3
我正在使用 NSFetchedResultsController
填充 tableView。 tableView 可能会变得很长,因为它显示了一个人员列表,我想按字母顺序对其进行排序。我知道我需要使用 titleForHeaderInSection
,但我仍然不知道如何在我的 fetchedObjectsController.fetchedObjects
中获取每个 object 的第一个字母并将其显示为 header 部分作为排序,通讯录应用程序的工作原理。
这就是我的视图控制器的样子。
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)
}
}
这是一个非常小的示例,说明如何获取 headers 文本,我仅将 class 用于只有名称的测试,然后使用 [= 应用 map
12=] 我们得到名称的第一个字符,在转换为 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([=10=].name.characters.prefix(1)) }).sorted(by: {[=10=] < })
debugPrint(finalArray)
控制台日志结果
["a", "b", "n", "p", "t"]
希望对您有所帮助
我正在使用 NSFetchedResultsController
填充 tableView。 tableView 可能会变得很长,因为它显示了一个人员列表,我想按字母顺序对其进行排序。我知道我需要使用 titleForHeaderInSection
,但我仍然不知道如何在我的 fetchedObjectsController.fetchedObjects
中获取每个 object 的第一个字母并将其显示为 header 部分作为排序,通讯录应用程序的工作原理。
这就是我的视图控制器的样子。
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)
}
}
这是一个非常小的示例,说明如何获取 headers 文本,我仅将 class 用于只有名称的测试,然后使用 [= 应用 map
12=] 我们得到名称的第一个字符,在转换为 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([=10=].name.characters.prefix(1)) }).sorted(by: {[=10=] < })
debugPrint(finalArray)
控制台日志结果
["a", "b", "n", "p", "t"]
希望对您有所帮助