0

I have ran into a problem. I am using AKPickerView which is just a cocoapod that works exactly like a UIPickerView.

The error I get is:

fatal error: Index out of range

On this particular line: let titleForModel = carModels[item]

This is what I have and I am trying to achieve:

I have two pickerViews, one for the car make/brand and one for the car model.

They both have their own delegates and datasources.

Until a car make/brand has been selected, only then will the carmodelPickerView be populated and presented to the user.

This is my full code:

    @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()
    }

The application crashes when I select a model and then switch the manufacterPickView.

I am extremely sorry if this is a simple question. I have never used a UIPickerView ever, hence the reason as to why I am struggling. Could someone please help me?

Thank you.

SwiftLearner
  • 144
  • 13

2 Answers2

0

See if this helps, if it doesn't tell me the problem again and I will edit this!

        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()
            }
        }
  }
Dark Innocence
  • 1,389
  • 9
  • 17
0

Fixed it. I noticed one thing. The modelPickerView would not reset.

So I made that a priority.

This line of code helped me:

modelPickerView.selectItem(0, animated: true)

My code now works and does not crash.

SwiftLearner
  • 144
  • 13