Search code examples
iosswiftuipickerview

Picker View crash when scroll down


I'm building a "Date" UiPickerView to be able to customize the font size, type and color.

Please see my code.

{

    @IBOutlet weak var dataInicio: UIPickerView!

    var dataDia1: NSMutableArray!
    var dataMes1: NSArray!
    var dataAno1: NSMutableArray!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.dataDia1 = NSMutableArray()

        for dia in 1...31
        {
            dataDia1.addObject("\(dia)")
        }

        self.dataMes1 = NSArray(objects: "Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro")

        self.dataAno1 = NSMutableArray()

        for ano in 1970...2016
        {
            dataAno1.addObject("\(ano)")
        }


    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
    {
        return 3
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    {
        if (component == 0)
        {
            return dataDia1.count
        }

        if (component == 1)
        {
            return dataMes1.count
        }

        else
        {
            return dataAno1.count
        }
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    {
        var componentStr = dataDia1[row]

        if(component == 0)
        {
            return componentStr as? String
        }

        if(component == 1)
        {
            componentStr = (dataMes1[row] as? String)!
            return componentStr as? String

        }
        else
        {
            componentStr = (dataAno1[row] as? String)!
            return componentStr as? String
        }
    }

}

It's building successful, but when I scroll down the year, it crashes when there are more than 27 components inside the array.

I'm initiating this and I have already looked around the web and didn't find nothing. :(

What am I doing wrong?


Solution

  • You call var componentStr = dataDia1[row] regardless of which component is being asked for. Change your code to this:

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    {
        if(component == 0)
        {
            var componentStr = dataDia1[row]
            return componentStr as? String
        }
        else if(component == 1)
        {
            var componentStr = (dataMes1[row] as? String)!
            return componentStr as? String
    
        }
        else
        {
            var componentStr = (dataAno1[row] as? String)!
            return componentStr as? String
        }
    }
    

    Also note the use of else if.