OOP - 使用UIView协调多个子视图?

时间:2013-03-24 22:30:13

标签: ios oop uiview

这是一个面向对象的编程问题:

所以我正在尝试构建一个显示散点图的UIView类。在我目前的实现中,我创建了一个数据源协议,允许chartView询问绘制其数据所需的所有信息。

现在,当有人初始化chartView并为其提供数据源时,chartview会创建/管理多个子视图:显示所有数据点的'dotsView',添加dotview的scrollview(所以它是可滚动的),以及位于背景中的“skeletonView”,并显示其他图表数据,如网格线。

这个系统最初工作得很好,但是,我决定我要对点的变化进行动画制作,所以我开始考虑使用collectionView来代替放置在scrollview中的'dotsView',因为它会为我处理动画。但是,由于集合视图需要委托,数据源,布局对象等,所以突然之间我的chartView看起来越来越像控制器而不是视图。

现在我的问题是:允许UIView协调/配置其他UIViews是否是错误的方法,即使这些UIViews是整体的基本要求?一方面,我喜欢保留chartView的公共界面的简单性(初始化视图,给它一个数据源,然后你就完成了)。另一方面,这个chartView不再是一个视图了,它更像是一个控制器。但我不希望我的图表的消费者像控制器一样思考/对待它,我希望他们将它用作视图。

有什么想法?我很想听听别人的见解。

谢谢!

2 个答案:

答案 0 :(得分:0)

你回答了你自己的问题我的朋友:允许UIView协调/配置其他UIViews是错误的方法 - 是的!视图应由控制器从组织立场IMHO投射。我会建立一个图表控制器,可以抛出单个视图和复合视图,并一举两得。您可以从Ajax将URL发送到控制器以更改图表中显示的数据

答案 1 :(得分:0)

ChartView创建UICollectionView,将其用作子视图,并成为该子视图的数据源和委托,这是完全没问题的,因为使用UICollectionViewChartView

的实施细节

Apple在UIPickerView中执行此操作。在封面下,选择器视图为每个组件创建一个表视图,选择器视图使自己成为每个表视图的数据源和委托。您可以在UIPickerView.h中看到它符合UITableViewDataSource。您可以在运行时使用UITableViewDelegate或在UIKit框架上使用class-dump来检查它是否符合+[NSObject conformsToProtocol:]。或者你可以编写一个测试应用程序并围绕视图层次结构。调试器命令po [[UIApp keyWindow] recursiveDescription]将帮助您入门。

UIPickerView是我知道的iOS SDK中唯一的视图子类,它充当其子视图的数据源和委托,但许多其他UIKit视图类创建和管理自己的子视图。例子:

  • UIScrollView有滚动指示器的私有子视图。
  • UITableView具有私有页眉,页脚,节索引和行分隔符子视图。
  • UIButton有一个显示其文字的私人UILabel和一个显示其图片的私人UIImageView
  • UISegmentedControl有私人UILabelUIImageView子视图。
  • UIProgressView使用多个私有UIImageView子视图来显示其各个部分。
  • UISlider使用多个私有UIImageView子视图来显示其各个部分。
  • UITextField使用私人UIImageView子视图。