看了其他类似的问题,但没有找到答案。整理出我遇到的一些问题,但仍然有一个问题,即第一个pickerView中的数据确定第二个pickerView中有哪些选择(应用程序的此部分是单位转换器)。
我了解出了什么问题,但是看不到如何解决问题。通过打印语句,我可以看到更改第一个pickerView时,保存第二个pickerView中的行数的值发生了变化。但是第二个pickerView标题不会更改,因此当我转到高于新数组中索引号的项目时,应用程序崩溃。错误索引超出范围可以确认这一点。
我已经提供了代码和pickerViews外观的快照(没有格式化或漂亮的外观-喜欢先获得功能)。
感谢您的帮助。
import UIKit
导入基金会
ViewController类:UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {
var conversionTypes = ["length", "mass", "area", "volume", "rate", "temp", "pressure"]
var conversionItems = [["metres", "feet", "yard", "inch", "cm"], ["kg", "lbs", "tonne", "ounces"], ["ft2", "m2", "in2"], ["US Gall", "UK Gall", "Bbls", "ft3", "m3"], ["bbl/min", "scf/min", "scf/hr"], ["degC", "degF", "Kelvin"], ["bar", "psi"]]
var littlePickerType = 0
var wheelOne = 0
var wheelTwo = 0
@IBOutlet weak var numberToConvert: UITextField!
@IBOutlet weak var answerLabel: UILabel!
@IBOutlet weak var littlePicker: UIPickerView!
@IBOutlet weak var bigPicker: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
littlePicker.delegate = self
littlePicker.dataSource = self
bigPicker.delegate = self
bigPicker.dataSource = self
let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tap)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
if pickerView == littlePicker {
return 1
} else if pickerView == bigPicker {
return 2
}
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView == littlePicker {
return conversionTypes.count
} else if pickerView == bigPicker {
return conversionItems[littlePickerType].count
}
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView == littlePicker {
return conversionTypes[row]
} else if pickerView == bigPicker {
return conversionItems[littlePickerType][row]
}
return ""
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView == littlePicker {
littlePickerType = row
} else if pickerView == bigPicker {
if component == 0 {
wheelOne = row
} else if component == 1 {
wheelTwo = row
}
}
print ("Conversion Type \(littlePickerType) WheelOne \(wheelOne) WheelTwo \(wheelTwo) count \(conversionItems[littlePickerType].count)")
}
}
答案 0 :(得分:1)
每当littlePickerType
发生变化时,您都应该在大型选择器上呼叫reloadAllComponents
。这将导致大选择器再次调用所有选择器视图数据源方法(尤其是titleForRow
)。
var littlePickerType = 0 {
didSet {
bigPicker.reloadAllComponents()
}
}