【问题标题】:iOS UIPickerView calls numberOfRowsInComponent even UIPickerViewDataSource is not boundiOS UIPickerView 调用 numberOfRowsInComponent 甚至 UIPickerViewDataSource 未绑定
【发布时间】:2017-01-02 10:26:47
【问题描述】:

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

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

【问题讨论】:

  • 您是否为故事板中的选取器视图设置了委托??
  • 是的,在我的界面生成器中,这段代码正在运行 btw,我的问题是 numberOfRowsInComponent 是如何调用的,即使它的协议没有实现

标签: ios swift sdk uipickerview uipickerviewdatasource


【解决方案1】:

正如您在评论中提到的,您已将 delegate/datasourcestoryboard 设置为,那么它相当于 pickerView.delegate = self / pickerView.datasource = self

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

【讨论】:

  • 好的,我已经从情节提要中设置了委托,但我既没有通过代码也没有通过情节提要设置数据源。 numberOfRowsInComponent 方法是一个 dataSource 方法,所以我的问题是这个方法是如何调用的,即使我没有对 dataSource 做任何事情
  • 您有多个pickerViews 吗?请检查您是否没有复制粘贴已经设置委托和数据源的视图。
  • 不,我只有一个pickerview
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多