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!
One Reply to “Editing Attractions”