我在UITableViewController中有一个UIPickerView作为子视图,我想在点击某一行时向上滑动。我已经实现了必要的dataSource和委托方法,但是pickerview很奇怪。它的作用似乎是机械卡住,它不能正常旋转,它只是移动一点。如果我尝试旋转几次,我会在调试器控制台中收到此消息:
SendDelegateMessage:委托失败 等待10秒后返回。 主运行循环模式: UITrackingRunLoopMode如果你不是 使用触摸屏这一整个 间隔(可以延长这个 等等),请提交一个错误。
我用Google搜索,但无济于事。 无论如何,这是相关的代码。正如您可能猜到的,这是一个数字选择器(用于选择百分比值)。
- (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方法,但这也没有改变任何东西。 顺便说一句,相同的选择器视图构造代码vorkw在同一个应用程序的另一个视图中。 有什么建议吗? 欢呼声,
答案 0 :(得分:1)
你并没有真正使用viewDidLoad中的代码将选择器添加到UITableView。 UITableView只能在UITableViewCells中拥有控件/行,并且这些控件/行在cellForRowAtIndex方法中指定。我们不能像UIView一样向UITableView添加控件。
尝试使用UIView的子类,并将UITableView和选择器添加到此UIView子类中。
如果您只想使用UITableViewController子类,请创建自定义单元格并将选择器添加到此自定义单元格。但是如果你静态添加它,你就无法隐藏/取消隐藏这个单元格。然后你将不得不使用reloadData。我建议使用UIView子类。