iOS UIPickerView调用numberOfRowsInComponent,甚至UIPickerViewDataSource也没有绑定

时间:2017-01-02 10:26:48

标签: ios swift sdk uipickerview uipickerviewdatasource

嗨,这个问题只是出于好奇心。

我的控制器中有UIPickerView,委托从IB绑定并在控制器中实现,并且UIPickerViewDataSource方法之一也在控制器numberOfRowsInComponent中实现。调用此方法,即使dataSource未完全绑定和实现。我想知道它怎么可能?我的一个想法是,这个方法隐含地从后台调用...我的代码;

class ViewController: UIViewController, UIPickerViewDelegate {

let titles = ["item 1", "item 2", "item 3", "item 4", "item 5"]

override func viewDidLoad() {
    super.viewDidLoad()
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return titles.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return titles[row]
}

2 个答案:

答案 0 :(得分:0)

正如您在评论中提到的,您已从delegate设置了datasource / storyboard,那么它等同于pickerView.delegate = self / pickerView.datasource = self

您可以通过编码 storyboard 指定delegatedatasource。因此,在您的情况下,您是从storyboard完成的,因此它实际上与您的pickerView绑定。

答案 1 :(得分:0)

这是一个惊人的,我们称之为功能。我没有太多的Obj-C背景,所以不知道为什么会发生这种情况。

我在某些视图中也有一个UIPickerView,它只有setLY set和dataSource方法被调用,尽管picker的数据源在运行时是nil。当我将 Swift 3 @objc推理更改为默认或从构建设置更改为no时,正确的方法不会被调用,因为dataSource是nil而且我有一个空的选择器。我不知道这个在Xcode上添加的时间,但很明显在Swift3出来之后。

所以我相信Obj-C实现有一些内部逻辑,即使只设置了委托,也会因某种原因调用dataSource方法。如果有人知道更多会很有趣,知道为什么会发生这种情况。