从文档中看,当您使用UIPickerView
类时,您必须采用UIPickerViewDelegate
和UIPickerViewDataSource
协议。但是,即使我在我的程序中没有采用UIPickerViewDataSource
,似乎我能够正确运行我的应用程序。例如,即使我编写以下代码:
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}
,我既没有在我的头文件中采用UIPickerViewDataSource
也没有在_myPickerView.datasource = self;
方法中编写viewDidLoad
,我可以成功运行我的应用,这意味着它在视图选择器中有两个组件。 (我接受了UIPickerViewDelegate
并写了_myPickerView.delegate = self;
。)
那么采用数据源是不必要的?如果是这样的话,为什么呢?我知道当我使用导航控制器时没有必要采用UITableViewDelegate
,因为父类已经采用了协议 - 所以这是同样的原因吗?
为了您的信息,即使应用程序无需采用数据源,我也无法使用Xcode中的“方法名称预测功能”。
我从UIViewController
继承了这个班级。我的Xcode版本是5.0.2。
感谢。
答案 0 :(得分:0)
UIPickerViewDelegate
和UIPickerViewDataSource
协议有两个不同的用途。
应该实现UIPickerViewDataSource
协议,因为它提供了生成UIPicker
所需的元数据(组件数,行数等)。
UIPickerViewDelegate
协议处理UIPicker
的任务,例如,选择器的值已更改,然后将调用委托方法。
UIPickerViewDataSource
协议,以便我们获得所需的选择器。
如果我们想在我们的选择器上实现一些基于事件的功能,则需要UIPickerViewDelegate
。
如果您没有实施UIPickerViewDelegate
方法并设置picker.delegate = self
,则应用会因为没有实施而崩溃。
如果您实施UIPickerViewDelegate
方法并且未设置picker.delegate = self
,那么应用程序将会运行,但应用程序不会响应选择器上的事件。
如果您没有实施UIPickerViewDataSource
方法并设置picker.datasource = self
,则应用会因为没有实施而崩溃。
如果您实施UIPickerViewDelegate
方法并且未设置picker.datasource = self
,那么应用程序将会运行,但选择器将显示为空,因为没有可用于生成选择器的元数据。