在 iOS 应用中使用 UIPickerView 时不需要采用数据源?

Posted

技术标签:

【中文标题】在 iOS 应用中使用 UIPickerView 时不需要采用数据源?【英文标题】:Unnecessary to adopt to datasource when using UIPickerView in iOS app? 【发布时间】:2013-12-31 10:32:10 【问题描述】:

从文档看来,当您使用UIPickerView 类时,您必须采用UIPickerViewDelegateUIPickerViewDataSource 协议。但是,即使我没有在我的程序中采用UIPickerViewDataSource,我似乎也能够正确运行我的应用程序。例如,即使我写了以下代码:

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
    return 2;

,我既没有在我的头文件中采用UIPickerViewDataSource,也没有在viewDidLoad方法中写入_myPickerView.datasource = self;,我可以成功运行我的应用程序,这意味着它在视图选择器中有两个组件。 (我收养了UIPickerViewDelegate,写了_myPickerView.delegate = self;。)

那么数据源就不需要采用了吗?如果是这样,为什么?我知道当我使用导航控制器时没有必要采用UITableViewDelegate,因为父类已经采用了协议 - 所以这是同样的原因吗?

请注意,即使应用程序在不采用数据源的情况下工作,我也无法使用 Xcode 中的“方法名称预测功能”。

我从UIViewController 继承了这个类。我的 Xcode 版本是 5.0.2。

谢谢。

【问题讨论】:

Malek,是的,我的意思是说 - numberOfComponentsInPickerView 来自数据源,而不是委托。 【参考方案1】:

UIPickerViewDelegateUIPickerViewDataSource 协议有两种不同的用途。 应该实现UIPickerViewDataSource 协议,因为它提供了生成UIPicker 所需的元数据(组件数、行数等)。

另一方面,UIPickerViewDelegate 协议处理 UIPicker 的任务,例如选择器的值已更改,然后将调用委托方法。

UIPickerViewDataSource 协议需要实现,以便我们获得所需的选择器。 如果我们想在我们的选择器上实现一些基于事件的功能,UIPickerViewDelegate 是必需的。

如果您不实现UIPickerViewDelegate 方法并设置picker.delegate = self,则应用将因未实现而崩溃。

如果您实现UIPickerViewDelegate 方法并且未设置picker.delegate = self,则应用将运行,但应用不会响应选择器上的事件。

如果您不实现UIPickerViewDataSource 方法并设置picker.datasource = self,则应用将崩溃,因为没有实现。

如果您实现UIPickerViewDataSource 方法并且未设置picker.datasource = self,则应用程序将运行但选择器将显示为空,因为没有可用于制作选择器的元数据。

【讨论】:

以上是关于在 iOS 应用中使用 UIPickerView 时不需要采用数据源?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 应用程序中通过 UIPickerView 实现视图之间的转换?

ios 7 中带有一个组件的自定义 UIPickerView

在 iOS 8 中使用 UIPickerview 作为 UITextfield 的输入视图时崩溃

UIPickerView - 无法在 ios7 中点击要选择的项目

带有自定义视图的 UIPickerView 在 iOS7 中被破坏

iOS 14 UIPickerView 所选行的颜色