【问题标题】:Assign keys and values from [(key: String, value: [[String : Any]])] in UITableView在 UITableView 中从 [(key: String, value: [[String : Any]])] 分配键和值
【发布时间】:2019-06-12 18:41:07
【问题描述】:

我有一个字典数组,[[String:AnyObject]],它被 reduce+sort 成功,如下所示。

 var arrUserList = [(key: String, value: [[String : Any]])]()


 let result = self.arrJsonDict.reduce(into: [String: [[String:Any]]]()) { result, element in
                    let strName: String = (element as! NSDictionary).value(forKey: "name") as! String
                    if let firstLetter = strName.first {
                        let initial = String(describing: firstLetter).uppercased()
                        result[initial, default: [[String:Any]]() ].append(element as! [String : Any])
                    }}.sorted { return $0.key < $1.key }


     self.arrUserList = result

现在我想将键分配给表格部分和值作为数组中的表格单元格文本。

【问题讨论】:

    标签: ios arrays swift uitableview dictionary


    【解决方案1】:

    这是非常繁琐的代码。

    强烈建议您至少使用成员 name 使用结构而不是字典

    struct Person {
        let name : String
    } 
    

    声明并重命名arrJsonDic(更具描述性)为

    var people : [Person]()
    

    arrUserList 一样

    var users = [String: [Person]]()
    

    对于sections声明另一个数组

    var letters = [String]()
    

    对数组进行分组并简单地填充letters

    users = Dictionary(grouping: people, by: { String($0.name.first!) })
    letters = users.keys.sorted()
    

    numberOfSections的表格视图中返回

    return letters.count
    

    numberOfRows 中返回

    let letter = letters[section]
    return users[letter]!.count
    

    cellForRowAt 中为标签分配名称

    let letter = letters[indexPath.section]
    let user = users[letter]![indexPath.row]
    cell.nameLabel.text = user.name
    

    ------------------

    为了让它仍然 swiftier 声明第二个结构 Section

    struct Section {
        let index : String
        let people : [Person]
    }
    

    删除

    var letters = [String]()

    并声明users

    var users = [Section]()
    

    分组略有不同

    let grouped = Dictionary(grouping: people, by: { String($0.name.first!) })
    users = grouped.map({ Section(index: $0.0, people: $0.1) }).sorted{$0.index < $1.index}
    

    三个表格视图委托方法中的代码是

    return users.count
    

    -

    return users[section].people.count
    

    -

    let user = users[indexPath.section].people[indexPath.row]
    cell.nameLabel.text = user.name
    

    【讨论】:

    • 感谢@vadian,但在对字典进行分组时,我收到错误消息“无法将 'Dictionary' 类型的值分配给类型 '[String : Person]'”。
    • 我的错,一定是var users = [String: [Person]]()。答案已更新。
    • 使用此代码 tableView 只返回带有单个记录的部分的第一个索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2021-04-10
    • 2020-04-19
    相关资源
    最近更新 更多