2016-04-18 36 views
0

我发现真的很奇怪,或者是一个糟糕的设计决定,UIPickerViewDelegate包含需要了解其数据(标题)的方法。因为这将是其DataSource的全部目的。像这些:UIPickerView DataSource x委托设计

pickerView(_:titleForRow:forComponent:) 
pickerView(_:attributedTitleForRow:forComponent:) 
pickerView(_:viewForRow:forComponent:reusingView:) 

我想要实现与不同对象PickerViewDataSourceDelegate。当然,创建一个新的代表很容易,可以称之为PickerViewListenerDelegate。但是,当苹果做出这个设计决定时,我认为首先值得讨论。

这个奇怪的设计决定的重点是什么?我在这里错过了什么吗?

回答

0

UIPickerViewDataSource协议只处理数据源的直接属性,即每个组件的数量和行数。

UIPickerViewDelegate协议地址介绍。它提供尺寸,标题或视图,以及选择更改的回调。

如果我们将其与UITableViewDataSourceUITableViewDelegate进行比较,奇怪的模式是完全不同的。

通常,delegatedataSource都会连线到同一个对象,即视图控制器,它将调用路由到底层模型并构建所需的UI元素。我个人认为,将dataSource连接到数据模型,但委托给控制器 - 做出了一个奇怪的决定,可以轻松地破坏封装。

所以基本上这意味着:是的,您可以使用给定的模式在模型和表示(即格式化程序)之间分开。如果你觉得它有用,取决于你。

+0

就像Table Views一样,我经常使用与DataSource和Delegate相同的Controller对象。然而,正如我所看到的那样,它们有两个不同的属性是有原因的,这一次它对于我的设计使用两个不同的对象是有意义的,但是'UIPickerViewDataSource'和'UIPickerViewDelegate'的奇怪设计阻止了我这样做。 (我不得不以奇怪的方式将它们连接起来,这样'委托人'就知道标题。 –