ravi
ravi

Reputation: 389

UIPickerView - In iOS5 didSelectRow is not called for all rows

Note: I have the delegate set properly and UIPicker works perfectly in ios6. In ios5 , the call back for didSelectRow: is called only if i select row0 or row5 only . I have 12 rows .

Does anyone have clue what could be wrong?

NOte: The UIPicker's delegate and data source are pointing to the class having the below code.

// returns the number of 'columns' to display.
        - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{

            if ([pickerView isKindOfClass:[MIDatePicker class]]) {

                switch (self.pickermode) {
                    case MIDatePickerModeDayMonth:
                        return 2;
                        break;
                    case MIDatePickerModeDayMonthYear:
                        return 3;
                        break;

                    default:

                        break;
                }
            }

            return 3;
        }

        // returns the # of rows in each component..
        - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

            if ([pickerView isKindOfClass:[MIDatePicker class]]) {

                //month , day , year
                switch (component) {
                    case 0:{
                        return [self.monthsArray count];
                    }
                        break;
                    case 1:
                    {
                        return [self.daysArray count];
                    }

                    case 2:{
                        return [self.yearArray count];
                    }

                    default:
                        break;
                }
            }

            return 3;
        }

        // returns width of column and height of row for each component.
        - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{

            // month , day ,year
            switch (component) {
                case 0:{
                    return self.picker.frame.size.width/2;
                }

                case 1:
                    return self.picker.frame.size.width/6;

                case 2:{
                    return self.picker.frame.size.width/3;
                }

                default:
                    break;
            }
            return self.picker.frame.size.width;
        }
        - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{

            return pickerView.frame.size.height/5;
        }


        - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
            // month , day ,year
            switch (component) {
                case 0:{
                    return [NSString stringWithFormat:@" %@ ",[self.monthsArray objectAtIndex:row]];
                }
                case 1:
                    return [self.daysArray objectAtIndex:row];

                case 2:{
                    return [self.yearArray objectAtIndex:row];
                }

                default:
                    break;
            }
            return @"";

        }


    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
        NSLog(@"selected row:%d , component:%d" , row,component);
    }

Upvotes: 1

Views: 298

Answers (1)

ravi
ravi

Reputation: 389

In ios5: Now i am getting all the calls for didSelectRow by casting float to integer.

My observations: The default picker height is 216.0 . The same piece of code works if i change the row height to pickerView.frame.size.height/3 or pickerView.frame.size.height/4 or even pickerView.frame.size.height/6; reason: 216.0 is perfectly divisible by 3,4,6 and when divided by 5 it has 0.2 fraction. Thats the reason i am getting the didSelect call only for row1 and row6 in case of pickerView.frame.size.height/5.

Decent Fix might be:

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{

    return (int) pickerView.frame.size.height/5;
}

Upvotes: 2

Related Questions