我刚创建了一个包含三个组件的UIPickerView。用户选择第1轮和第2轮中的数字,并根据这些选择,它将显示方向盘/组件3中两个可能的数组之一。我已经让它工作正常,但有一个例外:
问题: 为了基于组件1和2的选择更新第三组件,用户必须通过移动拾取轮实际上物理地选择项目。但是可能存在这样的情况:用户想要使用默认选择(在我的例子中是NSString" 0"在组件1和2中)并且不接触那些轮子。因此,组件3不会更新。
知道如何解决这个问题吗?有没有办法在用户选择第三个组件中的项目之前更新UIPickerView,以便将组件1和组件2中的默认选择作为实际选择而不用用户实际移动那些轮子?
或者让我们用这样的方式表达问题:我可以自动选择UIPickerView的默认行而不用手指选择特定行吗?
我试图完成的其他解释: 当用户在文本字段中单击时,将打开具有三列的UIPickerView。在第一个轮子中,用户选择0到16之间的数字,在第二个轮子中他将选择一个分数,在第三个轮子中选择一个测量单元。例如: 1 1/2杯, 1盎司, 1/2杯, 等等 根据数量和分数选择,第三个选取器轮中的单元名称将以单数或复数拼写显示(1杯对2杯)。只要触摸前两个轮子并进行物理选择,整个过程就能完美运行。问题:让我们举例说明用户想要选择" 1盎司"。他将第一个轮子移动到1,将第二个轮子单独移动(因为它已经定位在0上),然后选择"盎司"。但是使用我的代码,第三轮不会更新为单数拼写。只有,如果我实际上移动了第二个轮子并返回到0.然后第3个轮子立即改变。
谢谢!
这是我到目前为止的代码:
_countPickerData = @[@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", @"13", @"14", @"15", @"16"];
_fractionPickerData = @[@"0", @"1/2", @"1/4", @"1/8", @"3/4", @"3/8", @"5/8", @"7/8"];
_singularUnitPickerData = @[@"NONE", @"ounce", @"cup", @"pound"];
_pluralUnitPickerData = @[@"NONE", @"ounces", @"cups", @"pounds"];
// The number of columns of data
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 3;
}
// The number of rows of data
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
switch (component) {
case 0: return [_countPickerData count];
case 1: return [_fractionPickerData count];
case 2:
if (([countHelper isEqualToString:@"1"] && [countFractionHelper isEqualToString:@"0"]) || ([countHelper isEqualToString:@"0"] && ([countFractionHelper isEqualToString:@"1/2" ] || [countFractionHelper isEqualToString:@"1/4"] || [countFractionHelper isEqualToString:@"1/8"])))
{
return [_singularUnitPickerData count];
}
else
{
return [_pluralUnitPickerData count];
}
}
return 0;
}
// The data to return for the row and component (column) that's being passed in
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
switch (component)
{
case 0: return [_countPickerData objectAtIndex:row];
case 1: return [_fractionPickerData objectAtIndex:row];
case 2:
if (([countHelper isEqualToString:@"1"] && [countFractionHelper isEqualToString:@"0"]) || ([countHelper isEqualToString:@"0"] && ([countFractionHelper isEqualToString:@"1/2" ] || [countFractionHelper isEqualToString:@"1/4"] || [countFractionHelper isEqualToString:@"1/8"])))
{
pickedUnitHelper = [_singularUnitPickerData objectAtIndex:row];
return pickedUnitHelper;
}
else
{
pickedUnitHelper = [_pluralUnitPickerData objectAtIndex:row];
return pickedUnitHelper;
}
default:break;
}return nil;
}
// Preparing pickerView selection for textFieldIngredientUnit
NSInteger selectedRowUnit;
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
switch (component)
{
case 0:
countHelper = [_countPickerData objectAtIndex:row];
return;
case 1:
countFractionHelper = [_fractionPickerData objectAtIndex:row];
return;
case 2:
if (([countHelper isEqualToString:@"1"] && [countFractionHelper isEqualToString:@"0"]) || ([countHelper isEqualToString:@"0"] && ([countFractionHelper isEqualToString:@"1/2" ] || [countFractionHelper isEqualToString:@"1/4"] || [countFractionHelper isEqualToString:@"1/8"])))
{
pickedUnitHelper = [_singularUnitPickerData objectAtIndex:row];
return;
}
else
{
pickedUnitHelper = [_pluralUnitPickerData objectAtIndex:row];
return;
}
default:break;
}
}
答案 0 :(得分:1)
是的,您可以自动选择一行选择器,而无需用手指触摸它。例如:
[self.pickerView selectRow:0 inComponent:2 animated:YES];
在视图出现在屏幕上之前调用此方法。可能在viewWillAppear:
更新:
马库斯和我通过聊天检查了这一点,我想出了一个解决方案。基本上,任何时候:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
调用,如果它是组件0或1,我们需要重新加载组件2.我们这样做(在didSelectRow方法中),说:
[pickerView reloadComponent:2];
他的代码中还有一些其他小问题没有正常工作,但是出于堆栈溢出问题的目的,这就是需要解释的所有内容。
答案 1 :(得分:0)
我最近遇到了同样的问题(uipickerview没有选择第一个值)。我试着做..
[_myPicker selectRow:0 in Component:0 animated:YES];
但是仍然没有选择值,它将选择器转换为我在selectRow和Component中选择的任何值,但是没有在任何地方发送该值。所以我做的是在我的选择器阵列中创建一个额外的行。我的选择器值为1,2,3和4.所以当我添加数组时,它看起来像这样..
_myPickerArray = [[NSArray alloc] initWithObjects:@" ", @"1", @"2", @"3", @"4", nil];
现在用户必须转动滚轮才能选择一些东西。在您的代码中,您正在检查输入是否为1的字符串。如果他们选择了空格,则不会满足该条件。看看是否有效。