Табличное представление с разделом за первое письмо контакта - PullRequest
0 голосов
/ 11 октября 2019

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

Вот мой двумерный массив

 var contacts = [
     ExpandableNames(isExpanded: true, names: ["Hong Kong", "Bangkok, Thailand", "London, UK", "Singapore", "Bali, Indonesia"].map{ Contact(name: $0, hasFavorited: false) }),
       ]

ВотОшибка. Пожалуйста, помогите, не можете понять, как это исправить

      func createContactDict() {
                for contact in contacts {
                    // Get the first letter of the contact name and build the dictionary
                    let firstLetterIndex = contacts.index(contacts.startIndex, offsetBy: 1)
                    let contactKey = String(contacts[..<firstLetterIndex]) 

                    if var contactValues = contactsDict[contactKey] {
                        contactValues.append(contacts)
                        contactsDict[contactKey] = contactValues
                    } else {
                        contactsDict[contactKey] = [contact]
                    }
                }

Вот код, связанный с UITableViewDataSource

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let contactKey = contactSectionTitles[section]
        guard let contactValues = contactsDict[contactKey] else { return 0 }

        return contactValues.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! ContactCell
        cell.link = self
        let contact = contacts[indexPath.section].names[indexPath.row]

        cell.textLabel?.text = contact.name

        cell.accessoryView?.tintColor = contact.hasFavorited ? UIColor.red : .lightGray

        if showIndexPaths {
            cell.textLabel?.text = "\(contact.name)   Section:\(indexPath.section) Row:\(indexPath.row)"
        }

        // Configure the cell...
        return cell
    }

1 Ответ

0 голосов
/ 11 октября 2019

Если я правильно понимаю, чего вы хотите достичь, вы можете сделать это в две строки:

func createContactDict() {
    let contactNames = Array(contacts.map { $0.names }.joined())
    contactsDict = Dictionary(grouping: contactNames, by: { String($0.name.prefix(1)) })
}

Первая строка преобразует [ExpandableNames] в [Contact]

Вторая строка создает словарьгде ключи описываются как первая буква имени String($0.name.prefix(1)).


Отвечая на проблему с UITableViewDatasource, я думаю, что вам нужно перейти к методу tableView(_ tableView:, cellForRowAt:) и изменить эту строку:

let contact = contacts[indexPath.section].names[indexPath.row]

в:

let contactKey = contactSectionTitles[indexPath.section]
let contact = contactsDict[contactKey][indexPath.row]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...