0

嗨,这个问题只是为了好奇。

我的控制器中有 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]
}
4

2 回答 2

0

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

我在某些视图中也有一个 UIPickerView,它只设置了委托,并且调用了 dataSource 方法,尽管选择器的数据源在运行时为零。当我从构建设置将Swift 3 @objc 推断更改为 Default 或 no 时,正确地不会调用这些方法,因为 dataSource 为 nil 并且我有一个空选择器。我不知道这是什么时候在 Xcode 上添加的,但显然是在 Swift3 出来之后。

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

于 2018-02-01T10:30:36.590 回答
0

正如您在评论中提到的那样,您已经设置了delegate/ datasourcefrom storyboard,那么它相当于pickerView.delegate = self/ pickerView.datasource = self

您可以通过编码delegate或从storyboard分配。因此,在您的情况下,您是从 完成的,因此它实际上与您的.datasourcestoryboardpickerView

于 2017-01-02T10:50:22.507 回答