【问题标题】:Swift/Xcode - AKPickerView/UIPickerView - fatal error: Index out of rangeSwift/Xcode - AKPickerView/UIPickerView - 致命错误:索引超出范围
【发布时间】:2017-07-01 20:17:19
【问题描述】:

我遇到了问题。我正在使用 AKPickerView,它只是一个 cocoapod,其工作方式与 UIPickerView 完全相同。

我得到的错误是:

fatal error: Index out of range

在这一行: let titleForModel = carModels[item]

这就是我所拥有的并且我正在努力实现的目标:

我有两个pickerView,一个用于汽车品牌/品牌,一个用于汽车型号。

他们都有自己的委托和数据源。

在选择汽车品牌/品牌之前,carmodelPickerView 才会被填充并呈现给用户。

这是我的完整代码:

    @IBOutlet weak var manufacterPickView: AKPickerView!
    @IBOutlet weak var modelPickerView: AKPickerView!

    var carManufacturers: [String] = ["Select make...", "Abarth","Alfa Romeo","Aston Martin", "Audi", "Bentley","BMW","Bugatti", "Cadillac","Chevrolet","Chrysler","Citroen","Dodge", "Ferrari", "Fiat","Ford","Honda","Hyundai","Jaguar","Jeep","KIA","Lamborghini","Land Rover","Lexus","Lotus","Maserati", "Maybach","Mazda","Mercedes-Benz","Mini", "Mitsubishi","Nissan","Peugeot", "Porsche", "Renault", "Rolls Royce", "SEAT", "Skoda", "Smart","Subaru", "Suzuki", "Toyota", "Vauxhall", "Volkswagen", "Volvo"]

    var carModels = [" "]
    var carModelsBackup = [" "]
    var abarthModelsArray = ["500", "500C", "Grande Punto", "Punto Evo"]

    var alfaRomeoModelsArray = ["147", "156", "159","4C", "8C", "Brera", "Giulietta", "GT", "Mito"]


    override func viewDidLoad() {

        super.viewDidLoad()

        self.manufacterPickView.dataSource = self
        self.manufacterPickView.delegate = self

        self.modelPickerView.dataSource = self
        self.modelPickerView.delegate = self

        self.manufacterPickView.font = UIFont(name: "HelveticaNeue-Light", size: 20)!
        self.manufacterPickView.highlightedFont = UIFont(name: "HelveticaNeue", size: 20)!
        self.manufacterPickView.pickerViewStyle = .wheel
        self.manufacterPickView.maskDisabled = false
        self.manufacterPickView.reloadData()


        self.modelPickerView.font = UIFont(name: "HelveticaNeue-Light", size: 20)!
        self.modelPickerView.highlightedFont = UIFont(name: "HelveticaNeue", size: 20)!
        self.modelPickerView.pickerViewStyle = .wheel
        self.modelPickerView.maskDisabled = false
        self.modelPickerView.reloadData()
   }


  func numberOfItemsInPickerView(_ pickerView: AKPickerView) -> Int {

        var carBrand : Int = carManufacturers.count


        if pickerView == manufacterPickView {

        return self.carManufacturers.count
        }

        if pickerView == modelPickerView {

            return self.carModels.count
        }

        return carBrand
    }





    func pickerView(_ pickerView: AKPickerView, titleForItem item: Int) -> String {

        if pickerView == manufacterPickView {

            var titleForItem = carManufacturers[item]

                return titleForItem
        }

            if pickerView == modelPickerView {
                let titleForModel = carModels[item] //This is the line which appears in red and breaks at
                return titleForModel
            }



         return ""
    }


    func pickerView(_ pickerView: AKPickerView, didSelectItem item: Int) {

        if pickerView == manufacterPickView {

        if carManufacturers[item] == "Abarth" {
            carModels = abarthModelsArray
            modelPickerView.reloadData()
            }


        else if carManufacturers[item] == "Alfa Romeo" {
            carModels = alfaRomeoModelsArray
            modelPickerView.reloadData()
        }
        else {

            carModels = carModelsBackup
            modelPickerView.reloadData()
        }
    }
        modelPickerView.reloadData()
    }

当我选择一个模型然后切换manufacterPickView 时应用程序崩溃。

如果这是一个简单的问题,我非常抱歉。我从来没有使用过 UIPickerView,这就是我为什么挣扎的原因。有人可以帮我吗?

谢谢。

【问题讨论】:

    标签: ios xcode uipickerview uipicker


    【解决方案1】:

    看看这是否有帮助,如果它没有再次告诉我问题,我会编辑这个!

            var isManufacterSelected: Bool = false
    
        func numberOfItemsInPickerView(_ pickerView: AKPickerView) -> Int {
    
                if pickerView == manufacterPickView {
    
                return self.carManufacturers.count
                }
    
                if pickerView == modelPickerView && isManufacterSelected && !carModels.isEmpty {
    
                    return self.carModels.count
                }
                 else {
                   return 0
                }
            }
    
    
    
    
    
            func pickerView(_ pickerView: AKPickerView, titleForItem item: Int) -> String {
    
                if pickerView == manufacterPickView {        
                        return carManufacturers[item]
                }
    
                    if pickerView == modelPickerView &&isManufacterSelected {
                        return carModels[item]
                    }
            }
            func pickerView(_ pickerView: AKPickerView, didSelectItem item: Int) {
    
                if pickerView == manufacterPickView {
    
                if carManufacturers[item] == "Abarth" {
                    carModels.removeAll()
                    carModels = abarthModelsArray
                    isManufacterSelected = true
                    modelPickerView.reloadData()
                    }
    
    
                else if carManufacturers[item] == "Alfa Romeo" {
                    carModels.removeAll()
                    carModels = alfaRomeoModelsArray
                    isManufacterSelected = true
                    modelPickerView.reloadData()
                }
    
                else if carManufacturers[item] == "Select make..." {
                    isManufacterSelected = false
                    carModels.removeAll()
                    modelPickerView.reloadData()
                }
                else {
                    carModels.removeAll()
                    modelPickerView.reloadData()
                }
            }
      }
    

    【讨论】:

    • 感谢您的代码。但是,它仍然会崩溃 `return carModels[item]` 这是这一行。
    • 基本上,由于我的abarthArray 中有四个元素,如果我在carManufacter 选择器中选择Alfa Romeo 并到达alfaRomeoModelsArray 中的第四个元素以上,这会导致崩溃。
    • 我需要 carModels 基本上清除,并匹配我选择的 selectedArray 的大小。
    • 让我再看一遍,数组大小不是这里的问题,数组大小可以根据你传递的数据进行扩展或压缩
    • 添加了对数组是否为空的进一步检查,编辑了答案
    【解决方案2】:

    修复它。我注意到一件事。 modelPickerView 不会重置。

    所以我把它作为优先事项。

    这行代码帮助了我:

    modelPickerView.selectItem(0, animated: true)

    我的代码现在可以运行并且不会崩溃。

    【讨论】:

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