在 iOS 应用中使用 UIPickerView 时不需要采用数据源?
Posted
技术标签:
【中文标题】在 iOS 应用中使用 UIPickerView 时不需要采用数据源?【英文标题】:Unnecessary to adopt to datasource when using UIPickerView in iOS app? 【发布时间】:2013-12-31 10:32:10 【问题描述】:从文档看来,当您使用UIPickerView
类时,您必须采用UIPickerViewDelegate
和UIPickerViewDataSource
协议。但是,即使我没有在我的程序中采用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】:
UIPickerViewDelegate
和UIPickerViewDataSource
协议有两种不同的用途。
应该实现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 中点击要选择的项目