开发者

Searching for the Right Pattern (iPhone/Objective C)

开发者 https://www.devze.com 2022-12-18 18:11 出处:网络
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 Ob

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

精彩评论

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

关注公众号