How would I be able to arrange the cells by sections with a custom header
I have code set to arrange the cells in the CartVC by brand(placing the brand in the CartHeaderCell). When the data is passed from the HomeVC to the CartVC, I can't get my code arrange the cells into sections by brand from the code I created in the CartVC. (currently code passes data from HomeVC to CartVC without arranging the cells into sections)
How would I be arrange the sections by brand in the CartVC after data is passed into the Cart
Update:
Right Now the code in the CartViewController Extension
arranges the cells into sections and passes the items into the cells by the brand, but scrambles all the cells into random sections or create a new section for the brand in the cells, and/or crashes the simulator when the CartBtn is pressed, or shows the same item/cell in multiple sections
extension HomeController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return itemSetup.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "HomeCell") as? HomeCell else { return UITableViewCell() }
let item = itemSetup[indexPath.row]
cell.configure(withItems: item)
// passes data to the Cart Cells in the CartVC when ATC Btn is pressed in each HomeCell
cell.addActionHandler = { (option: Int) in
print("Option selected = \(option)")
Tray.currentCart.cartItems.append(item)
item.selectedOption = option
}
return cell
}
}
import UIKit
class CartViewController: UIViewController {
var items: Items!
// arranges cells into sections
var tray: [Tray] = []
var sortedBrandsByName: [String] = []
var sections: [[Tray]] = [[]]
@IBOutlet weak var cartTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// arranges cells into sections
let brandNames = tray.map { $0. titleBrandName }
let uniqueBrandNames = Array(Set(brandNames))
let sortedBrandNames = uniqueBrandNames.sorted()
let sections: [[Tray]] = sortedBrandNames.map { firstBrandNames in
return tray
.filter { $0. titleBrandName == firstBrandNames }
.sorted { $0.cart.brand < $1.cart.brand } // sort them
}
// Do any additional setup after loading the view.
cartTableView.dataSource = self
cartTableView.delegate = self
}
}
extension CartViewController: UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return Tray.currentCart.cartItems.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//allows data passed from the HomeVC populate the CartCells
return Tray.currentCart.cartItems[section].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CartCell", for: indexPath) as! CartCell
// **Active code** that allows data passed from the HomeVC populate the CartCells
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 = Tray.currentCart.cartItems[section].brand
return cartHeader
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 45
}
}
class CartHeaderCell: UITableViewCell {
@IBOutlet weak var brandName: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}
class CartCell: UITableViewCell {
@IBOutlet weak var lblMealName: UILabel!
@IBOutlet weak var imageUrl: UIImageView!
@IBOutlet weak var lblSubTotal: UILabel!
@IBOutlet weak var lblQty: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
// allows the data to be passed into the cart cells
func configure(withItems items: Items) {
imageUrl.sd_setImage(with: URL(string: items.imageUrl))
lblQty.text = "\(items.count)"
let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.numberStyle = .decimal
if items.selectedOption == 1 {
lblSubTotal.text = "$\(formatter.string(for: items.price1 * Float(items.count))!)"
lblMealName.text = "\(items.name) ● \(items.weight1)"
} else if items.selectedOption == 2 {
lblSubTotal.text = "$\(formatter.string(for: items.price2 * Float(items.count))!)"
lblMealName.text = "\(items.name) ● \(items.weight2)"
} else if items.selectedOption == 3 {
lblSubTotal.text = "$\(formatter.string(for: items.price3 * Float(items.count))!)"
lblMealName.text = "\(items.name) ● \(items.weight3)"
}
}
}
// allows the code that is passed to the CartVC when an item is passed from the HomeVC to the CartVC
class Tray {
static let currentCart = Tray()
var cartItems = [Items]()
var cart: Items!
var sectionTitle: String!
}
extension Tray {
var titleBrandName: String {
return String(self.cart.brand[self.cart.brand.startIndex]).uppercased()
}
}