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.
Stacking the Deck
Yesterday I threw together a little ASCII-rendered layout of nested stack views and mentioned that I’d start implementing it by putting the existing Add and Cancel buttons in a horizontal stack view. So the goal for today is to spike something like this in my
+==================+ || ADD || CANCEL|| <- Horizontal stack view +==================+
Eventually, the goal is to refactor this out into context, container and content view controllers, but right now that’s overthinking it. Remember, the goal of this rewrite is a “one small change per day” approach.
I noticed a UI bug, too: when the user taps the Add button, the action’s completion block enables the clear-list button. This means that if you tap the add button to create the first product on the list, and cancel out of that action instead of adding something, that clear-list button still gets enabled.
I can’t add this logic to the completion block, though — it’ll check the length of the product list before the product item actually gets added, rather than after.
Completion blocks are insidious in this way. You think they’re going to run, y’know, after completion, but always ask yourself: after completion of what?
We want the logic for enabling the clear-list button to be triggered by actually adding an item, so we can instead move it to the
add(item:) delegate method in the product list context view controller. This gets called by the product detail content view controller when the user taps the Add button, which is all we need!
Good! So today I started implementing the layout by putting the product detail view’s buttons in a horizontal stack view, and fixed a little UI bug. Tomorrow, I’m going to continue by adding a vertical stack view for all the labels and text fields.