Ios 斯威夫特的UIPickerView
我有一个标签,我想通过编程从我的用户那里添加一个生日,我设法用数据填充,但我无法正确提取数据,这是我的代码:显示一个错误,例如索引超出范围,并使我的应用程序崩溃Ios 斯威夫特的UIPickerView,ios,swift,uikit,Ios,Swift,Uikit,我有一个标签,我想通过编程从我的用户那里添加一个生日,我设法用数据填充,但我无法正确提取数据,这是我的代码:显示一个错误,例如索引超出范围,并使我的应用程序崩溃 class SignUpFormViewController: UIViewController { let date = Date() let formatter = DateFormatter() let years = (1800...2100).map{String($0)} let days
class SignUpFormViewController: UIViewController {
let date = Date()
let formatter = DateFormatter()
let years = (1800...2100).map{String($0)}
let days = (1...31).map{String($0)}
var pickerMonth: [String] = [String]()
var pickerDay: [String] = [String]()
var pickYears: [String] = [String]()
var selectedMonth: String?
var selectedDay: String?
var selectedYear: String?
//other stuff
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
handleGestureRecognizer()
self.datePickerView.delegate = self
self.datePickerView.dataSource = self
datePickerComponents()
}
}
extension SignUpFormViewController: UIPickerViewDelegate, UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 3
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return pickerMonth.count//month
}else if component == 1 {
return pickerDay.count//day
}else {
return pickYears.count//year
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
return pickerMonth[row]
}else if component == 1 {
return pickerDay[row]
}else {
return pickYears[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
birthDateTextField.text = "\(pickerMonth[row])/\(pickerDay[row])/\(pickYears[row])"
}
func datePickerComponents() {
pickerMonth = formatter.shortMonthSymbols
pickerDay = days
pickYears = years
}
}
问题在于:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
birthDateTextField.text = "\(pickerMonth[row])/\(pickerDay[row])/\(pickYears[row])"
}
那太简单了。想想看。用户一次只旋转一个组件,并调用您的方法。假设这是用户旋转的年份组件。你有300个。比如说,排成300排。但是pickerMonth没有300个月的时间!所以当你天真地说pickerMonth[行]时,你崩溃了
您要做的是询问选择器视图在所有三个组件中选择了哪一行,并将该行用于该组件
birthDateTextField.text =
pickerMonth[pickerView.selectedRow(inComponent:0)]
+ "/" +
pickerDay[pickerView.selectedRow(inComponent:1)]
+ "/" +
pickYears[pickerView.selectedRow(inComponent:2)]
修正了代码未经测试,只是直接输入,所以请仔细检查我。工作非常完美,我最近刚开始IOS开发,除了工作之外,我还做了一个辅助项目,以便更好地学习。