【问题标题】:fatal error: Index out of range in swift while taking options from uipicker致命错误:从 uipicker 获取选项时索引超出范围
【发布时间】:2017-04-28 02:52:40
【问题描述】:

我有 3 个文本字段,例如选择性别、国家、州。我正在使用UIPickerUIPicker 获取输入值。但是现在当我按性别UITextField 打开 UIPickerenter code here 时,UIPickerenter code here 显示没有数据。但同样的UIPicker 用于国家、州。那个时候它用UIPicker 显示这两个国家的数据,状态文本字段。谁能帮帮我。如何解决这个问题。

错误:

致命错误:索引超出范围

如果我在 uipicker 选项视图中按下它只会崩溃。

我的代码:

我在这个类文件中遇到了崩溃:

import Foundation

import SwiftCountryPicker

class DataPicker: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {

    var dataPicker: UIPickerView!
    var inputText:UITextField!
    var parent:UIViewController!
    var pickerData: [String]!
    var feetStr = String()
    var inchStr = String()

    private var _selectedValue: String!

    var selectedvalue: String {
        return _selectedValue ?? String()
    }

    func showPicker(parent:UIViewController,inputText:UITextField, data: [String], selectedValueIndex: Int){

        self.inputText = inputText
        self.parent = parent
        pickerData = data

        if dataPicker == nil {
            dataPicker = UIPickerView(frame: CGRectMake(0,0,parent.view.frame.size.width, 216))
            dataPicker.backgroundColor = UIColor.whiteColor()
            dataPicker.dataSource = self
            dataPicker.delegate = self
            dataPicker.selectRow(selectedValueIndex, inComponent: 0, animated: true)
            _selectedValue = pickerData.count > 0 ? pickerData[selectedValueIndex] : ""
        }
        inputText.inputView = dataPicker

        // ToolBar
        let toolBar = UIToolbar()
        toolBar.barStyle = .Default
        toolBar.translucent = true
        toolBar.tintColor = UIColor(hex: "B12420")
        toolBar.backgroundColor = UIColor.whiteColor()
        toolBar.sizeToFit()

        // Adding Button ToolBar
        let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(DataPicker.doneClick))
        let spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: #selector(DataPicker.cancelClick))
        toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
        toolBar.userInteractionEnabled = true
        inputText.inputAccessoryView = toolBar

    }

    func doneClick() {
        inputText.text = _selectedValue
        inputText.resignFirstResponder()
    }
    func cancelClick() {
        inputText.resignFirstResponder()
    }




    func numberOfComponentsInPickerView(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]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        _selectedValue = pickerData[row]
    }

}

在这一行:

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent 组件:Int) {

        _selectedValue = pickerData[row]
    }

我的文本字段代表按下 texfield:

extension UserInfoViewController:UITextFieldDelegate{

    func textFieldDidBeginEditing(textField: UITextField) {

        selectedText = textField

else if  textField == genderss {
            ctDataPicker = DataPicker()
            let indexPos = genders.indexOf(genderss.text!) ?? 0
            ctDataPicker.showPicker(self, inputText: textField, data: genders,selectedValueIndex: indexPos)
        }

}
}

【问题讨论】:

  • 首先检查let indexPos = genders.indexOf(genderss.text!) ?? 0 indexPos 值和'pickerData'计数是否相同
  • 检查pickerData是否有数据?
  • 什么值包含性别数组?
  • 从技术上讲,这不会发生,因为您使用相同的数组填充了选择器。您可能想检查数组是否在填充选择器和选择行之间发生了变化。
  • @AndeySatyanarayana Satyanarayana 数字为 0 (indexpos) ndata 为 0 (pickerData.count)

标签: ios swift uipickerview


【解决方案1】:

UIPickerViewDataSource 方法 didSelectRow 在 Swift 4 中被更改:

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]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    TextField.text = myPickerData[row]
}

尝试将崩溃的 _selectedValue 行更改为文本字段示例

TextField.text = myPickerData[行]

UIPickerView 上检查Apple Documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多