У меня есть UIPickerView в качестве подпредставления в UITableViewController, который я хочу сдвинуть вверх на месте при нажатии на определенную строку. Я реализовал необходимые методы dataSource и делегата, но представление выбора действует странно. Он действует так, как будто он механически заклинило, он не может вращаться должным образом, он просто немного двигается. Если я несколько раз попробую его раскрутить, то получу сообщение в консоли отладчика:
SendDelegateMessage: делегат не выполнен
вернуться после ожидания 10 секунд.
режим основного цикла:
UITrackingRunLoopMode Если вы не были
используя сенсорный экран для всего этого
интервал (который может продлить это
подождите), пожалуйста, сообщите об ошибке.
Я гуглил это безрезультатно.
Во всяком случае, вот соответствующий код. Как вы можете догадаться, это средство выбора номера (для выбора процентного значения).
- (void)viewDidLoad {
[super viewDidLoad];
percentPicker = [[UIPickerViewalloc] initWithFrame:CGRectMake(0,420, 320, 200)];
percentPicker.delegate = self;
percentPicker.dataSource = self;
percentPicker.showsSelectionIndicator = YES;
[self.view addSubview:percentPicker];
}
- (void)viewWillAppear:(BOOL)animated {
// sets the rows to the appropriate value
// etc
}
- (void)startEditingPercentage {
[UIView beginAnimations :nilcontext:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIViewsetAnimationDuration:kPickerAnimationDuration ];
percentPicker.transform = CGAffineTransformTranslate(CGAffineTransformIdentity, 0, -220.0);
[UIViewcommitAnimations];
}
- (void)stopEditingPercentage {
NSLog(@"stopEditingPercentage");
[UIView beginAnimations :nilcontext:NULL];
[UIViewsetAnimationBeginsFromCurrentState:YES];
[UIViewsetAnimationDuration:kPickerAnimationDuration];
percentPicker.transform = CGAffineTransformIdentity;
[UIView commitAnimations];
}
#pragma mark UIPickerView delegate and dataSource methods
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return4;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return10;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
return44;
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
UILabel *retval = (UILabel *)view;
if (!retval) {
retval= [[UILabel newLabelWithPrimaryColor :[UIColorblackColor ] selectedColor:[ UIColor blackColor] fontSize:22bold:YEStransparent:YES] autorelease];
}
retval.frame = CGRectMake(0, 0, 44, 44);
retval.textAlignment = UITextAlignmentCenter;
retval.backgroundColor = [UIColor clearColor];
retval.text = [NSStringstringWithFormat:@"%i", row];
if (component > 1 ) {
// rows 2 and 3 are decimal, white on black
retval.backgroundColor = [UIColor blackColor];
retval.textColor = [UIColor whiteColor];
}
return retval;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSString *selectedValue;
selectedValue= [NSString stringWithFormat:@"%i%i.%i%i" ,[percentPickerselectedRowInComponent :0], [ percentPickerselectedRowInComponent: 1], [percentPickerselectedRowInComponent:2], [percentPickerselectedRowInComponent:3]];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
NSString *trimmedValue = [[formatter numberFromString:selectedValue] stringValue];
percentValue.text = trimmedValue;
[formatter release];
}
Как вы видите, я использую свойство transform для перемещения палитры внутрь и наружу (вниз) моего основного вида; Методы startEditing и stopEditing запускаются выбором в представлении teble. Тем не менее, для целей отладки я исключил эти переходы и оставил средство выбора поверх таблицы, но ничего не изменилось. Я также прокомментировал метод didSelect, но это также ничего не изменило.
Кстати, тот же самый строительный код вида выбора ворква в другом представлении того же приложения.
Любое предложение?
Cheers,