2017-07-26 54 views
1

我正在使用NSFetchedResultsController来填充tableView。 tableView可以变得很长,因为它显示了一个人的列表,我想按字母顺序排序。我知道我需要使用titleForHeaderInSection,但我坚持如何获得我的fetchedObjectsController.fetchedObjects中每个对象的第一个字母,并将其显示为部分标题以及对它进行排序,即联系人应用程序的工作方式。如何使用NSFetchedResultsController创建按字母顺序排列的标题 - Swift 3

这是我的视图控制器的样子。

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) 
    } 
} 
+0

我的回答对你有帮助吗? –

回答

0

这是你如何能得到您的标题文本,我使用一个类只能用于测试只有名字,然后使用characters.prefix我们得到的名称和铸造后的第一个字符应用map一个非常小的例子到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”]

希望这可以帮到你

相关问题