2009-01-06 52 views
3

我有一个UIPickerView作为UITableViewController中的子视图,我想在点击某个行时将其滑动到位。我已经实现了必要的数据源和委托方法,但pickerview的行为奇怪。它的行为就像它被机械卡住,它不能正确旋转,它只是移动一点。如果我尝试了几次旋转它,我得到的调试器控制台此消息:UIPickerView添加到uitableviewcontroller.view将不会旋转

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方法,但这也没有改变任何东西。 顺便说一句,相同的选择器视图构建代码vorkw在同一个应用程序的另一个视图中保持不变。 有什么建议吗? 干杯,

回答

1

你不是真的使用viewDidLoad中的代码添加选择器到UITableView。 UITableView只能在UITableViewCells中有控件/行,这些在cellForRowAtIndex方法中指定。我们不能像UIView那样向UITableView添加控件。

尝试使用UIView的子类,并将UITableView和选择器添加到此UIView子类。

如果您只想使用UITableViewController子类,请创建一个自定义单元格并将该选择器添加到此自定义单元格中。但是如果你静态添加它,你将无法隐藏/取消隐藏这个单元格。那么你将不得不使用reloadData。我会建议使用UIView子类。

+0

非常感谢,这个问题让我疯狂。事实上,我怀疑UITableViewController可能是罪魁祸首,但并没有试图改变它。我现在意识到我只是添加了5行代码来测试我的疑问。 干杯,大卫 – nutsmuggler 2009-01-07 17:06:22