UIPickerView picker.reloadAllComponents() 在 swift 4 中不起作用



我有一个picker.reloadAllComponents()调用,因为我更改了数据源。但是我Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)得到一个错误,我知道为什么,但我想UIPickerView表现得好。

我希望UIPickerView刷新其显示的列表,并根据新条件将列表刷新到 UI:

class ViewControllerDisplay: UIViewController, UIPickerViewDataSource{
  //......
   var pickerData: [String] = []
   func numberOfComponents(in pickerView: UIPickerView) -> Int {  return 1  }
   func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
      return pickerData.count
   }
   func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
      return pickerData[row] //<-- Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
   }
   func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
       self.view.endEditing(true)
   }
   let pickerView = PREMUIPickerView(frame: CGRect(x: 0, y: 130, width: 250, height: 300))
   pickerView.dataSource = self
   pickerView.delegate = self

然后,我在更改文本框时执行此操作:

    pickerData = []
    for node : [String:Any] in _choices{
        let _nodename = node["name"] as? String ?? ""
        let _filtername = filterField.text ?? ""
        if ((_nodename.range(of: _filtername)) != nil){
            pickerData.append(_nodename)
        }
    }

然后我简单地这样做

   for view in (filterField.superview?.subviews)! {
        if let picker = view as? UIPickerView {
            picker.reloadAllComponents()
        }
    }

现在。应该发生的是 UIPickerView 应该重置它的数据源并根据过滤列表重绘到 UI。其实不然。pickerData列表肯定会被过滤。但是,视觉元素不会改变,因此我从func pickerViewThread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0))中的行中得到一个fatal error: Index out of range错误,所以我的问题是:

您如何不仅使用picker.reloadAllComponents()刷新数据源,还告诉 iOS 实际刷新数据源?

很抱歉,我犯了一个错误,它确实有效。问题出在代码中的其他地方,关于我如何识别选取器视图。(基本上我答错了,页面更上一页)。

我会保留代码,以防有人想要基于 uipickerview 的过滤器列表

最新更新