代码之家  ›  专栏  ›  技术社区  ›  Andrew Johnson

寻找正确的模式(iphone/objective c)

  •  0
  • Andrew Johnson  · 技术社区  · 15 年前

    编辑:有人建议我实施战略模式( http://en.wikipedia.org/wiki/Strategy_pattern ,我想我可以将其作为在objective-c中实现委托协议的几个对象来执行。这完成了我想要的封装,同时仍然允许我在内存中使用通用视图控制器。

    我有一个名为detailviewcontroller的类,它显示关于各种数据类型的信息——航路点、轨迹、地图、照片。

    现在,这个类有1400行长,它有一些混乱的switch语句。例如:

    - (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]];
      }
    }
    

    如果我创建了detailviewcontroller的子类,这会更整洁,但我的难题是我想将viewcontroller保留在内存中,只需更改某些元素,这样我就可以进行清晰的转换,特别是在3g手机上。

    我觉得如果我想让我的代码整洁,我就必须在性能上有所突破。

    2 回复  |  直到 15 年前
        1
  •  4
  •   user97370    15 年前

    将当前视图放在对象的某个字段中(而不是每种类型的迷你视图都有一个字段),并为每种类型的迷你视图实现changeminiview。

    那么你的方法应该是:

    - (void) changeMiniView: (id)sender {
        [self.currentMiniView changeMiniView: [sender selectedSegmentIndex]];
    }
    
        2
  •  1
  •   tomute    15 年前

    使用选择器怎么样?

    - (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];
    }