所以这就是我所拥有的;具有根ViewController
(子类)的UIView
,其中一个子视图为UISegmentedControl
。 UIView
绘制同心圆,UISegmentedControl
更改这些圆圈的颜色。为了做到这一点,我在UIView
loadView中创建了ViewControllers
并将其添加到self.view,然后我创建了UISegmentedControl
并将其添加为我{{1}的子视图}。然后,我将UIView
设置为UIView
的目标,并在UISegmentControl
中实施了一种方法来更改颜色并将其设置为操作。这一切都有效。
一些参考代码
UIView
//setting up view hierarchy in viewcontroller.m
- (void)loadView{
BNRHypnosisView *backgroundView = [[BNRHypnosisView alloc]init];
self.view = backgroundView;
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc]initWithItems:@[@"Red",@"Green",@"Blue"]];
[segmentedControl addTarget:backgroundView
action:@selector(changeColor:)
forControlEvents:UIControlEventValueChanged];
[backgroundView addSubview:segmentedControl];
}
所以对于我的问题......在这里我将超级视图视为我的子视图的控制器,这是错的吗?应该保留由拥有//action
- (void)changeColor:(UISegmentedControl *)sender{
switch (sender.selectedSegmentIndex) {
case 0:
self.circleColor = [UIColor redColor];
break;
case 1:
self.circleColor = [UIColor greenColor];
break;
case 2:
self.circleColor = [UIColor blackColor];
break;
}
}
的视图控制器处理的所有内容。如果是这样,我怎么能在这种情况下这样做?
-Thanks
并且任何人都会接受它是的,这是BNR iOS编程书的挑战之一:]
答案 0 :(得分:1)
在MVC中,这是错误的。正如你所说,你看到一个控制器,这永远不应该。你的目标应该是使你的大多数课程独立于其他课程(松耦合)。
在您的情况下,您应该将所有代码,尤其是目标操作代码移动到视图控制器。 更改操作以定位viewDidLoad中的viewController:
[segmentedControl addTarget:self
action:@selector(changeColor:)
forControlEvents:UIControlEventValueChanged];
[backgroundView addSubview:segmentedControl];
并将changeColor方法移动到视图控制器并将方法的发送者强制转换为UISegmented控件:
- (void)changeColor:(id)sender{
UISegmentedControl *segControl = (UISegmentedControl *) sender;
switch (segControl.selectedSegmentIndex) {
case 0:
circleView.circleColor = [UIColor redColor];
break;
case 1:
circleView.circleColor = [UIColor greenColor];
break;
case 2:
circleView.circleColor = [UIColor blackColor];
break;
}
}
要使其工作,您需要为circleView创建一个属性,因此在视图控制器中创建一个属性,并在创建circleView时将其分配给属性。
@proprety (nonatomic, strong) BNRHypnosisView *circleView;
并在你的loadView:方法中:
- (void)loadView{
self.circleView = [[BNRHypnosisView alloc]init];
self.view = self.circleView;