UIPickerView重用视图始终为零

Ami*_*r_P 1 uipickerview ios swift

根据Apples API引用在此方法中重用视图

optional func pickerView(_ pickerView: UIPickerView, 
          viewForRow row: Int, 
        forComponent component: Int, 
             reusing view: UIView?) -> UIView
Run Code Online (Sandbox Code Playgroud)

是一个由选择器视图的缓存视图,但当我尝试将它用于下一行时,它总是为零,而当我返回UILabel时,重用视图为零.问题是什么?这是我的实施:

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
    let pickerLabel = UILabel()
    pickerLabel.textColor = UIColor.black
    pickerLabel.text = "10"
    pickerLabel.textAlignment = NSTextAlignment.center
    pickerLabel.sizeToFit()
    return pickerLabel
}
Run Code Online (Sandbox Code Playgroud)

rma*_*ddy 7

您的代码不会尝试使用重用视图.你的代码应该是这样的:

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
    var pickerLabel : UILabel
    if let label = view as? UILabel {
        pickerLabel = label
    } else {
        pickerLabel = UILabel()
        pickerLabel.textColor = UIColor.black
        pickerLabel.textAlignment = NSTextAlignment.center
    }

    pickerLabel.text = "10"
    pickerLabel.sizeToFit()

    return pickerLabel
}
Run Code Online (Sandbox Code Playgroud)

如果重用视图是标签,则此代码重用标签.否则,它会创建并设置一个新标签.

请注意,选择器只会在滚动选择器视图时传入重用视图.它类似于表视图的单元重用.

  • 当我在该函数中编写“print(view)”时,它总是打印 nil。所以它永远不会到达 if 语句 (2认同)
  • 我添加了 50 个假行,是的,我正在滚动,每次都打印 nil (2认同)
  • 这是一个实现细节.无法保证选择器会重用任何视图.我不担心. (2认同)