This post is part of a series about rewriting my iOS app, Per. Per is a price per unit comparison app with a bunch of neat convenience figures, but it hasn’t been updated in years, so I’m rewriting it from scratch to eliminate a bunch of technical debt. Just because it’s not an open-source app doesn’t mean I can’t share what I learn as I go!
See the rest of the series here.
Building the UITableView in code
If you try to simply add
var productTableView: UITableView = UITableView() as a property and then set its
self without touching the other boilerplate methods, you’ll crash the app with this error:
*** Assertion failure in -[UITableView _dequeueReusableCellWithIdentifier:forIndexPath:usingPresentationValues:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3901.4.2/UITableView.m:8624 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier customcell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
This makes sense! The commented-out
tableView(cellForRowAt:) method needs to be uncommented, and I need to give this table view a UITableViewCell to work with. And it’s not too hard, I just need to add this to the table view controller’s
productTableView.register(UITableViewCell.self, forCellReuseIdentifier: "productListCell")
Adding the ProductList data
Now I can create a
ProductList in the table view controller, populate it with some fake data, and start working with it!
Getting that to display just requires three lines in
let productItem = productList.getItems()[indexPath] let productUnits = productItem.units?.symbol ?? "units" cell.textLabel?.text = "\(productItem.quantity) \(productUnits) for \(productItem.price) costs \(productItem.pricePerUnit) per unit"
Remember that the
indexPath is collection of two values (
[section, row]), so we want to specify its row value (
indexPath) as our index for the array returned by
There’s no formatting, and it’s a static view of data that we can’t add to, but we’re slowly getting there! Tomorrow, I’ll start working on a way to add product items to the table view.