我有另一个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多种不同的方法来完成这项工作,但没有任何帮助。任何建议将不胜感激。提前致谢!
答案 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
}
更好地改善对象结构是一件好事,否则很快您将失去对应用程序的控制。