嗨,这个问题只是出于好奇心。
我的控制器中有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]
}
答案 0 :(得分:0)
正如您在评论中提到的,您已从delegate
设置了datasource
/ storyboard
,那么它等同于pickerView.delegate = self
/ pickerView.datasource = self
。
您可以通过编码或 storyboard 指定delegate
和datasource
。因此,在您的情况下,您是从storyboard
完成的,因此它实际上与您的pickerView
绑定。
答案 1 :(得分:0)
这是一个惊人的,我们称之为功能。我没有太多的Obj-C背景,所以不知道为什么会发生这种情况。
我在某些视图中也有一个UIPickerView,它只有setLY set和dataSource方法被调用,尽管picker的数据源在运行时是nil。当我将 Swift 3 @objc推理更改为默认或从构建设置更改为no时,正确的方法不会被调用,因为dataSource是nil而且我有一个空的选择器。我不知道这个在Xcode上添加的时间,但很明显在Swift3出来之后。
所以我相信Obj-C实现有一些内部逻辑,即使只设置了委托,也会因某种原因调用dataSource方法。如果有人知道更多会很有趣,知道为什么会发生这种情况。