我有一个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 pickerView
(Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
)中的行中得到一个fatal error: Index out of range
错误,所以我的问题是:
您如何不仅使用picker.reloadAllComponents()
刷新数据源,还告诉 iOS 实际刷新数据源?
很抱歉,我犯了一个错误,它确实有效。问题出在代码中的其他地方,关于我如何识别选取器视图。(基本上我答错了,页面更上一页)。
我会保留代码,以防有人想要基于 uipickerview 的过滤器列表