iOS子视图最佳实践

时间:2014-05-21 06:07:18

标签: ios objective-c uiviewcontroller subview

所以这就是我所拥有的;具有根ViewController(子类)的UIView,其中一个子视图为UISegmentedControlUIView绘制同心圆,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编程书的挑战之一:]

1 个答案:

答案 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;