如何让我的 tableview 中的一个部分下的多个项目按字母顺序排序?

How can I have more than one item under a section in my tableview sorted alphabetically?

我已经实现了 FetchedControllerDelegate,并且我对 table 视图进行了排序,以便所有内容都按字母顺序显示,并且 headers 部分正在运行。但是,对于带有字母 "T" 的部分,例如,如果地名与 不完全 相同的词,则 table 视图有两个不同的部分.例如,对于 "Taco Bell" 和 "Texas",它们分别位于标签为 "T" 的不同部分下。我想要它,以便每个以 "T" 开头的单词都在 "T" 部分名称下。我找到了有关如何执行此操作的信息,但它适用于 Obj-C 而不是 Swift。此外,还有涉及设置瞬态 属性 的答案,但我不知道从哪里开始实施

How to use the first character as a section name

NSFetchedResultsController with sections created by first letter of a string

    // Add Sort Descriptors
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]

    // Initialize Fetched Results Controller
    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, 
        managedObjectContext: self.managedObjectContext, 
        sectionNameKeyPath: "name", cacheName: nil)

然后table查看方法:

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

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

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 20
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if let sections = fetchedResultsController.sections {
        let currentSection = sections[section]
        if let char = currentSection.name.characters.first {
            return String(char)
        }
        return currentSection.name
    }

    return nil
}

在你的 NSManagedObject 子类中添加一个计算 属性 和 return 名称的第一个字符,

var nameFirstChar: String {
    get {
        if let char = self.name?.characters.first {
            return String(char)
        }
        return "#"
    }
}

现在将 nameFirstChar 设置为您的部分键路径,例如,

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "nameFirstChar", cacheName: nil)