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

时间:2017-10-31 18:29:51

标签: ios swift uipickerview

我有picker.reloadAllComponents()电话,因为我更改了数据源。但是我收到错误Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)并且我知道为什么但我想让UIPickerView表现出来。

我希望UIPickerView刷新显示的列表,并根据新条件将列表添加到用户界面:

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列表肯定会被过滤掉。然而,视觉元素没有改变,因此我从fatal error: Index out of rangefunc pickerView)的行中得到Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)错误,所以我的问题是:

如何使用picker.reloadAllComponents()以上的数据来刷新数据源并告诉iOS实际刷新数据源?

1 个答案:

答案 0 :(得分:0)

道歉我犯了一个错误,确实有效。问题的其他部分是关于我如何识别选择器视图的问题。 (基本上我错了一个,在页面的另一个上面。)

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