Editing Attractions

The task of getting Fort Collins for Kids to edit Attractions in the AttractionDetailView has been harder than expected. I got some boilerplate code from The Big Nerd Ranch, but that code doesn’t provide the Undo button that I want in this app.

There were a number of different ways to do this- I chose to put almost all of the logic into the AttractionDetailView itself. The interface looks like this:

- (id)initWithExistingAttraction:(Attraction *)a;
- (id)initWithNewAttraction;

Inside I keep around two private properties, attraction and existingAttraction as well as a boolean named usingExistingAttraction.

Here’s the logic for initWithExistingAttraction:

usingExistingAttraction = YES;
[self setAttraction:[a copy]];
[self setExistingAttraction:a];

It’s probably worth pointing out that I changed the Attraction class to support NSCopying so that I can do a true deep copy.

Here’s the logic for initWithNewAttraction:

usingExistingAttraction = NO;
[self setAttraction:[[Attraction alloc] init]];

This creates a blank attraction and starts editing on it.

The cancel routine just dismisses the form, but the save routine does some interesting work:

if (usingExistingAttraction) {
    [[AttractionStore defaultStore] replaceAttraction:_existingAttraction withAttraction:_attraction];
} else {
    [[AttractionStore defaultStore] addAttraction:_attraction];

If we’re editing an existing attraction, we replace the current attraction in the global data store with the new one (and yes, the replaceAttraction:withAttraction routine is a new one crafted for this purpose.) If it’s a new attraction we’re editing, we just add it to the global data store.

It works.

But I don’t like it. There are two things I don’t like about it:

  • The detail view controller needs to know whether or not it’s editing a new attraction or an existing attraction
  • The detail view controller needs to know about the AttractionStore

As I was having a beer with my friend Paul it occured to me that setting up a delegate would be a cleaner design. Now, the existing design isn’t that bad, and I could probably live with it. But the point of this project is to learn about iOS development, and I’ve never defined my own delegate, so… time to get to work!