开发者

Searching for the Right Pattern (iPhone/Objective C)

EDIT: It was suggested to me that I implement the strategy pattern (http://en.wikipedia.org/wiki/Strategy_pattern), which I think I would do as several objects that implement a delegate protocol in Objective-C. This accomplishes the encapsulation I want while still allowing me to have a generic view controller in memory.

I have a class called DetailViewController that displays information about various types of data - waypoints, trails, maps, photos.

Right now, this class is 1400 lines long and it has some messy switch statements. For example:

-开发者_开发问答 (void) changeMiniView:(id)sender {

  if (self.track) {
    [self changeTrackMiniView:[sender selectedSegmentIndex]];
  } else if (self.waypoint) {
    [self changeWaypointMiniView:[sender selectedSegmentIndex]];
  } else if (self.photo) {
    [self changePhotoMiniView:[sender selectedSegmentIndex]];
  } else if (self.map) {
    [self changeMapMiniView:[sender selectedSegmentIndex]];
  }
}

This would be a lot neater if I made subclasses of DetailViewController, but my conundrum is I would like to keep the viewController in memory and just change certain elements, so I can have crisp transitions, particularly on 3G phones.

I feel like if I want my code to be neat, I have to take a performance hit.


Have the current view in a field in your object (rather than one field for every type of miniview you have), and implement changeMiniView for each of them.

Then your method would look like:

- (void) changeMiniView: (id)sender {
    [self.currentMiniView changeMiniView: [sender selectedSegmentIndex]];
}


How about using selector?

- (void)viewDidLoad {
    if (self.track) {
        sel = @selector(changeTrackMiniView:);
    } else if (self.waypoint) {
        sel = @selector(changeWaypointMiniView:);
    } else if (self.photo) {
        sel = @selector(changePhotoMiniView:);
    } else if (self.map) {
        sel = @selector(changeMapMiniView:);
    }
}

- (void)changeTrackMiniView:(id)sender {
    ....
}

- (void)changeMiniView:(id)sender {
    [self performSelector:sel withObject:sender];
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜