I’ve been looking around for a good pattern to implement a insert then cancel pattern when working with a UINavigationBar and UITableView.
I have I have a “insert”button in my TeamsViewController navigation bar (screenshot)
Which when I run it runs this code:
-(void)insertTeam
{
if( !detailViewController ) {
detailViewController = [[TeamDetailViewController alloc] init];
}
if( !teams ) {
teams = [NSMutableArray array];
}
Team *team = [[Team alloc] init];
[teams addObject:team];
int lastIndex = [teams count];
[detailViewController setEditingTeam:[teams objectAtIndex:lastIndex - 1]];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
[self presentModalViewController:navigationController animated:YES];
}
Which is great if the user fills out all the info, but if they hit cancel on the next view, there’s an empty object in my arrary.
I’m sure there’s a great pattern to achieve this but I’ve looked at all the TableView sample codes, two different ios books, and tried googling it, but haven’t found a pattern for this.
My thought is something like the following:
- When user cancels, set a canceled ivar in my Team object to YES
- Back in my TeamsViewController, when the view appears check the last object in my teams array and see if it’s property canceled is YES, if so remove that last object.
But this doesn’t seem so slick and I was figuring there was some better way to achieve this. TIA.
I would be tempted to make the TeamsViewController a delegate of the TeamDetailViewController. The delegate would implement a method such as
- (void)teamCreated:(Team *)team;and it would update the array. Since there seems to be no point to having a Team in the array that’s incomplete, I would have the TeamDetailViewController create the Team and pass it back in the delegate call. On a cancel, there would be no need to do anything except pop the controller.