Reputation: 389
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
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