我有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 range
(func pickerView
)的行中得到Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
错误,所以我的问题是:
如何使用picker.reloadAllComponents()
以上的数据来刷新数据源并告诉iOS实际刷新数据源?
答案 0 :(得分:0)
道歉我犯了一个错误,确实有效。问题的其他部分是关于我如何识别选择器视图的问题。 (基本上我错了一个,在页面的另一个上面。)
如果有人想要基于uipickerview的过滤器列表,我会保留代码