Как получить буквенные разделы tableView от объекта - PullRequest
1 голос
/ 15 октября 2019

Этот вопрос был ранее опубликован, как Алфавитные разделы в табличном представлении таблицы в быстром , но я не могу действительно обернуть его, когда пытаюсь внедрить его в свой собственный код.

У меня есть стандартные функции для установки буквенных разделов:

func numberOfSections(in tableView: UITableView) -> Int {
    return collation.sectionTitles.count
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return collation.sectionTitles[section]
}

func sectionIndexTitles(for tableView: UITableView) -> [String]? {
    return collation.sectionIndexTitles
}

func tableView(tableView: UITableView!, sectionForSectionIndexTitle title: String!, atIndex index: Int) -> Int {
    return collation.section(forSectionIndexTitle: index)
}

У меня есть массив, в котором собраны данные из локальной книги контактов в приложении: var contactArray = [ExternalAppContactsBook](). ExternalAppContactsBook выглядит следующим образом:

class ExternalAppContactsBook {
    var firstName = ""
    var lastName = ""
    var phoneNumber = ""
    var company = ""
}

Я бы хотел перечислить объект в алфавитном порядке на основе lastName в соответствующих разделах. Я понимаю, что магия случается в cellForRowAt, но я не могу понять это правильно. Статья выше отображает строку в словарь, но мне нужен объект, который усложняет вещи.

Я сопоставил dictionary, разбив lastName из object на его собственные array следующим образом:

var lastNameArray = [String]()

for index in self.contactArray {
    lastNameArray.append(index.lastName)
}

let groupedDictionary = Dictionary(grouping: lastNameArray, by: {String($0.prefix(1))})
let keys = groupedDictionary.keys.sorted()
var mapedSection = [Section]()
mapedSection = keys.map{Section(letter: $0, names: groupedDictionary[$0]!.sorted())}

Но как мне его использовать?

Может ли кто-нибудь дать мне несколько советов, чтобы начать?

РЕДАКТИРОВАТЬ Это работает таким образом, но я не уверен, будет ли это работатьупорядочить объект в tableview:

for index in self.contactArray {
    lastNameArray.append(index.lastName)
}

if let c = self.contactArray {
    let groupedDictionary = Dictionary(grouping: lastNameArray, by: {String($0.prefix(1))})
    let keys = groupedDictionary.keys.sorted()
    var mapedSection = [Section]()
    mapedSection = keys.map{Section(letter: $0, names: groupedDictionary[$0]!.sorted())}
    print("☎️", mapedSection)
}

Печать показывает:

Раздел (буква: "H", имена: ["Haro", "Higgins"]), Раздел (буква: «Т», имена: [«Тейлор»])

... и т. Д. Я думаю, что все еще может быть проблема при заполнении tableView.

1 Ответ

1 голос
/ 15 октября 2019

Вы должны сгруппировать contactArray и sections (этого имени достаточно) должны стать массивом источника данных

var sections = [Section]()

, и вы должны объявить Section

struct Section {
    let letter : String
    let people : [ExternalAppContactsBook]
}

let groupedDictionary = Dictionary(grouping: contactArray, by: {String($0.lastName.prefix(1))})
let keys = groupedDictionary.keys.sorted()
sections = keys.map{Section(letter: $0, people: groupedDictionary[$0]!.sorted(by: {$0.lastName < $1.lastName})}

Согласно моему ответу в связанном вопросе методы источника данных и делегата

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return sections[section].people.count
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int{
    return sections.count
}

func sectionIndexTitles(for tableView: UITableView) -> [String]? {
    return sections.map{$0.letter}
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return sections[section].letter
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...