1

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

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

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

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

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

有什么想法吗?我很想听听其他人的见解。

谢谢!

4

2 回答 2

0

您可以ChartView创建一个.UICollectionViewUICollectionViewChartView

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

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

  • UIScrollView其滚动指示器具有私有子视图。
  • UITableView具有私有页眉、页脚、部分索引和行分隔符子视图。
  • UIButton有一个私有UILabel来显示它的文本和一个私有UIImageView来显示它的图像。
  • UISegmentedControl有私人UILabelUIImageView子视图。
  • UIProgressView使用几个私有UIImageView子视图来显示其部分。
  • UISlider使用几个私有UIImageView子视图来显示其部分。
  • UITextField使用私有UIImageView子视图。
于 2013-03-25T02:47:13.190 回答
0

您回答了您自己的问题,我的朋友:允许 UIView 协调/配置其他 UIView 是否是错误的方法 - 是的!视图应该由控制器从组织角度恕我直言。我会构建一个图表控制器,它可以抛出单个和复合视图并用一块石头杀死两只鸟。您可以将 url 从 Ajax 路由到控制器以更改图表中表示的数据

于 2013-03-25T02:22:14.053 回答