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开发,除了工作之外,我还做了一个辅助项目,以便更好地学习。