UITableView - 如何以编程方式在该标题内放置与标题共享前缀的字符串?

时间:2017-04-19 17:21:50

标签: ios iphone swift xcode uitableview

假设我有3个标题 - "A""B""C"

我有一个像这样的字符串数组,它们的名称和数量一直在变化 -

["A 483", "A 736", "B 673", "C 524", "C 245", "C 974"]

我希望我的数组中以A开头的每个字符串都位于"A"标题下,一个以B开头的字符串进入"B"标题,依此类推。

2 个答案:

答案 0 :(得分:2)

使用此功能(如果您想查看它的功能,可以将此代码放在Playground中):

let nameQuantity = ["A 113", "B 123", "C 133", "D 143", "C 153", "D 163", "B 173", "C 183"]

let lettersToNameQuantity = nameQuantity.reduce([:]) { (result: [String: [String]], next: String) -> [String: [String]] in
    var newResult = result
    if let c = next.characters.first {
        let firstLetter = String(c)
        if let _ = newResult[firstLetter] {
            newResult[firstLetter]!.append(next)
        } else {
            newResult[firstLetter] = [next]
        }
    }
    return newResult
}

let numSections = lettersToNameQuantity.count
let numRowsInC = lettersToNameQuantity["C"]?.count
let rowsInC = lettersToNameQuantity["C"]
let sortedKeys = lettersToNameQuantity.keys.sorted()

lettersToNameQuantity将如下所示:

["B": ["B 123", "B 173"], 
 "A": ["A 113"], 
 "C": ["C 133", "C 153", "C 183"], 
 "D": ["D 143", "D 163"]]

您可以使用它来实现表的数据源。密钥不按排序顺序排列,因此请务必使用sortedKeys确定哪个部分是哪个字母。

答案 1 :(得分:0)

您可以使用Dictionary对数组进行分组,然后在tableView中按部分分隔。

func groupedItems () -> [String : [String]]{
        let test =  ["A 483", "A 736", "B 673", "C 524", "C 245", "C 974"];
        var grouped = [String : [String]]();
        for item in test {
            let prefix = item.components(separatedBy: " ")[0]
            //or let value = item (to include the whole string)
            let value = item.components(separatedBy: " ")[1]
            if var list = grouped[prefix] {
                list.append(value)
                grouped[prefix] = list
            } else {
                grouped[prefix] = [value]
            }

        }
        return grouped
    }

使用:

    lazy var grouped : [String : [String]] = self.groupedItems()
    .
    .
    .
    .

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return Array(self.grouped.keys)[section]
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let key = Array(self.grouped.keys)[section]
        let values = self.grouped[key]
        return values!.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return Array(self.grouped.keys).count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell : UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "identifier")
        if cell == nil {
            cell = UITableViewCell(style: .default, reuseIdentifier: "identifier")
        }
        let key = Array(self.grouped.keys)[indexPath.section]
        let values = self.grouped[key]
        cell?.textLabel?.text = values?[indexPath.row]
        return cell!
    }

<强>结果:

enter image description here