这是一个面向对象的编程问题:
因此,我正在尝试构建一个显示散点图的UIView类。在我当前的实现中,我已经创建了一个数据源协议,它允许chartView请求绘制其数据所需的所有信息。
现在,当有人初始化chartView并给它一个数据源时,图表视图创建/管理几个子视图:一个显示所有数据点的'dotsView‘,一个添加了点视图的滚动视图(因此它是可滚动的),以及一个位于后台并显示其他图表数据(如网格线)的'skeletonView’。
这个系统一开始运行得很好,然而,我决定我想要对点进行动画更改,所以我开始考虑使用collectionView来代替放置在滚动视图中的'dotsView‘,因为它会为我处理动画。然而,由于集合视图需要委托、数据源、布局对象等,突然之间,我的chartView看起来越来越像一个控制器而不是视图。
现在我的问题是:允许一个UIView协调/配置其他UIViews,即使这些UIViews是整体的基本需求,这是错误的方法吗?一方面,我希望保持chartView公共接口的简单性(初始化视图,给它一个数据源,然后就完成了)。另一方面,这个chartView实际上不再是一个视图,它更像是一个控制器。但我不希望我的图表的使用者将其视为控制器,我希望他们将其用作视图。
有什么想法吗?我很想听听别人的见解。
谢谢!
发布于 2013-03-25 10:47:13
您的ChartView
完全可以创建一个UICollectionView
,将其用作子视图,并作为该子视图的数据源和委托,因为UICollectionView
的使用是ChartView
的一个实现细节。
苹果在UIPickerView
中做到了这一点。在幕后,选取器视图为每个组件创建一个表视图,并且选取器视图使其自身成为每个表视图的数据源和代理。您可以在UIPickerView.h
中看到它符合UITableViewDataSource
。您可以在运行时使用+[NSObject conformsToProtocol:]
或通过在UIKit框架上使用class-dump
来检查它是否符合UITableViewDelegate
。或者,您可以编写一个测试应用程序并查看视图层次结构。调试器命令po [[UIApp keyWindow] recursiveDescription]
将启动。
据我所知,UIPickerView
是iOS软件开发工具包中唯一的视图子类,它充当其子视图的数据源和委托,但许多其他UIKit视图类都创建和管理自己的子视图。示例:
UIScrollView
的滚动indicators.UITableView
有私有的子视图,有私有的页眉、页脚、节索引行分隔符subviews.UIButton
有一个专用的image.UISegmentedControl
来显示其文本,一个专用的UILabel
来显示它的parts.UISlider
,而UIImageView
UILabel
使用几个私有的UIImageView
子视图来显示它的UILabel
,UIImageView
使用几个专用的UIImageView
子视图来显示它的UIImageView
。
发布于 2013-03-25 10:22:14
我的朋友,您回答了自己的问题:允许一个UIView协调/配置其他UIViews是错误的方法吗?是的!视图应该由控制员从组织的角度进行转换。我会构建一个图表控制器,它可以剔除单一视图和复合视图,一举两得。您可以将urls从Ajax路由到控制器,以更改图表中表示的数据
https://stackoverflow.com/questions/15604825
复制相似问题