带有每个联系人首字母的部分的Tableview

时间:2019-10-11 08:04:04

标签: arrays swift dictionary

我正在做一个数组,并试图将其放入索引列表和字母顺序,但出现错误。

这是我的twoDimensionalArray

 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 :(得分:0)

如果我正确理解了您想要实现的目标,则可以分两行完成:

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]