在 iOS 中正确使用视图控制器和 MVC 模式

proper use of viewcontrollers and MVC pattern in iOS

我经常看到在互联网上发布的代码示例,其中一些视图被添加到 ios 的根视图中,在 iOS 的生命周期方法内的视图控制器中。

- (void)viewDidLoad 
{
 [super viewDidLoad];

 // Slider 1

 slider = [[[DCSlider alloc] initWithDelegate:self]];
 slider.tag = 0;
 slider.frame = CGRectMake(0,0,20,100);
 [slider addTarget:self action:@selector(controlBassValueDidChange:) forControlEvents:UIControlEventValueChanged];
 [self.sliderContainer addSubview: slider];

 // Slider 2 

 slider2 = [[[DCSlider alloc] initWithDelegate:self]];
 slider2.tag = 1;
 slider2.frame = CGRectMake(0,0,20,100); 
 [slider2 addTarget:self action:@selector(controlBeatValueDidChange:) forControlEvents:UIControlEventValueChanged];
 [self.sliderContainer2 addSubview: slider2]; 
}

但是,这不是打破了 MVC 模式吗?

因为根据我的理解,ViewControllers 应该只是控制器,不应该直接参与视图修改相关的活动。有没有办法在单独的视图和控制器块中构建代码?

好问题。

不,它不会破坏 MVC 模式。

控制器 "manage" 视图,当然可以有很多;他们可能正在操纵数据以通过视图呈现它;他们可能正在操纵由它管理的视图的定位;或者他们可以构建这些观点本身的呈现方式——其中包含 "managing" 的含义。在这个定义中,我认为可以肯定地说控制器应该在不破坏 MVC 模式的情况下直接参与视图修改。

控制器中的addSubview:方法可以!控制器是 "managing" 它下面的视图,通过添加一个子视图,该子视图又由同一控制器管理。

当然,如果视图层次结构很复杂,并且如果很多视图独立于控制器执行特定任务,您认为可以模块化,您可以给它们自己的控制器并将它们添加为子控制器不破坏任何模式。