如何使用自定义标题单元按字母顺序将tableview单元按节排列?

时间:2019-11-20 15:58:20

标签: ios arrays swift uitableview sorting

我有另一个ViewController的代码,该代码通过闭包传递数据以填充CartVC中的单元格,而CartVC则传递数据以成功填充单元格

我现在想要做的是让我的CartVC将单元格按其品牌划分为多个部分。但是所有传递到Tableview中的数据最终都会将单元格加扰成随机部分

我一直在尝试按表格中的字母顺序按表中的品牌对数据进行排序。我已经成功创建了版块和索引,但无法弄清楚如何对品牌进行排序;在CartHeaderCell中,品牌的每个部分均按字母A-Z排序,并带有品牌的完整词组。

我的Items的模型类具有以下对象:名称,品牌,价格,重量,imageUrl和类别。 tableView通过cell.configure(withItems: cart)显示名称,图像,重量,价格和类别,以填充CartCells和CartHeaderCells中的品牌

import UIKit

class CartViewController: UIViewController {

    var items: Items!

    var setUp: [Tray] = []
    var groupedItems: [String: [Tray]] = [:]
    var brands: [String] = []

    @IBOutlet weak var cartTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        cartTableView.dataSource = self
        cartTableView.delegate = self

        groupedItems = Dictionary(grouping: setUp, by: {$0.brand})
        brands = groupedItems.map{$0.key}.sorted()
    }

}

extension CartViewController: UITableViewDataSource, UITableViewDelegate {

    func numberOfSections(in tableView: UITableView) -> Int {
        return Tray.currentCart.cartItems.count
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CartCell", for: indexPath) as! CartCell

        let itemToDisplay = groupedItems[brands[indexPath.section]]![indexPath.row] 
        let cart = Tray.currentCart.cartItems[indexPath.row]
        cell.configure(withItems: cart)

        return cell
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let cartHeader = tableView.dequeueReusableCell(withIdentifier: "CartHeaderCell") as! CartHeaderCell

        cartHeader.storeName.text = "Brand: \(Tray.currentCart.cartItems[section].brand)"
        return cartHeader
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 45
    }

}

class Tray {
    static let currentCart = Tray()
    var cartItems = [Items]()
    var cart: Items!
}

我已经尝试了20多种不同的方法来完成这项工作,但没有任何帮助。任何建议将不胜感激。提前致谢!

1 个答案:

答案 0 :(得分:0)

请记住,UITableView使用其数据源来了解哪些信息应出现在屏幕上。似乎您已经有了一个数据源列表,因此您只需要对该列表进行排序,UITableViewDataSource就会对其进行迭代。做这样的事情:


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CartCell", for: indexPath) as! CartCell

        let brandSource = Tray.currentCart.cartItems[indexPath.section].sorted{$0.brand.lowercased() < $1.brand.lowercased()} 
        let cart = brandSource[indexPath.row]
        cell.configure(withItems: cart)

        return cell
}

更好地改善对象结构是一件好事,否则很快您将失去对应用程序的控制。