具有多个组件的 UIPickerView/基于组件 1 和 2 选择的第 3 个组件项
UIPickerView with multiple components / 3rd component items based on component 1 and 2 selection
我刚刚创建了一个包含三个组件的 UIPickerView。轮子 1 和 2 中的用户 selects 数字和基于这些 select 离子它将显示 wheel/component 3 中两个可能的数组之一。我已经让它工作得很好一个例外:
问题:
为了根据组件 1 和组件 2 的 selection 更新第三个组件,用户必须通过移动选择器轮实际 select 一个项目。但可能存在用户想要使用默认 selection 的情况(在我的例子中,组件 1 和 2 中的 NSString“0”)并且不接触那些轮子。因此组件 3 将不会更新。
知道如何解决这个问题吗?有没有一种方法可以在用户 selects 之前更新 UIPickerView 第三个组件中的项目,以欺骗组件 1 和 2 中的默认 selection 作为实际 select离子而不让用户实际移动那些轮子?
或者让我们以这种方式提出问题:我可以自动 select 编辑 UIPickerView 的默认行,而不用手指 select 编辑特定行吗?
对我试图完成的事情的补充说明:
当用户单击文本字段时,将打开一个包含三列的 UIPickerView。在第一个轮子中,用户 select 是一个介于 0 和 16 之间的数字,在第二个轮子中,他将 select 一个分数,在第三个轮子中,他将是一个测量单位。例如:
1 1/2 杯,
1 盎司,
1/2 杯,
等等
根据数字和分数 selection,第三个选择器轮中的单位名称将以单数或复数拼写显示(1 杯对 2 杯)。只要触摸前两个轮子并完成物理 selection,整个事情就会完美地进行。问题:让我们以用户想要 select “1 盎司”为例。他会将第一个轮子移动到 1,将第二个轮子单独放置(因为它已经定位在 0 上),然后选择 "ounces"。但是使用我的代码,第三个轮子不会更新为单数拼写。只有,如果我真的移动第二个轮子并回到0。然后第三个轮子立即改变。
谢谢!!
这是我目前的代码:
_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;
}
}
是的,您可以自动 select 选择器的一行,而无需用手指触摸它。例如:
[self.pickerView selectRow:0 inComponent:2 animated:YES];
在视图出现在屏幕上之前调用它。大概在 viewWillAppear:
更新:
Markus 和我通过聊天检查了这个问题,然后我想出了一个解决方案。基本上,任何时候:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
被调用,如果它是组件 0 或 1,我们需要重新加载组件 2。我们这样做(在 didSelectRow 方法中)通过说:
[pickerView reloadComponent:2];
他的代码中还有其他一些小问题无法正常工作,但就此堆栈溢出问题而言,这就是所有需要解释的内容。
我最近遇到了同样的问题(uipickerview 没有 select 第一个值)。我试过..
[_myPicker selectRow:0 in Component:0 animated:YES];
但这仍然没有 select 值,它将选择器转到我在 select 行和组件中选择的任何内容,但没有将该值发送到任何地方。所以我所做的是在我的选择器数组中创建一个额外的行。我的选择器值为 1、2、3 和 4。所以当我添加数组时,它看起来像这样..
_myPickerArray = [[NSArray alloc] initWithObjects:@" ", @"1", @"2", @"3", @"4", nil];
现在用户必须将滚轮转到 select 某处。在您的代码中,您正在检查输入是否为 1 的字符串。如果它们 select space,则不会满足该条件。看看是否可行。
我刚刚创建了一个包含三个组件的 UIPickerView。轮子 1 和 2 中的用户 selects 数字和基于这些 select 离子它将显示 wheel/component 3 中两个可能的数组之一。我已经让它工作得很好一个例外:
问题: 为了根据组件 1 和组件 2 的 selection 更新第三个组件,用户必须通过移动选择器轮实际 select 一个项目。但可能存在用户想要使用默认 selection 的情况(在我的例子中,组件 1 和 2 中的 NSString“0”)并且不接触那些轮子。因此组件 3 将不会更新。
知道如何解决这个问题吗?有没有一种方法可以在用户 selects 之前更新 UIPickerView 第三个组件中的项目,以欺骗组件 1 和 2 中的默认 selection 作为实际 select离子而不让用户实际移动那些轮子?
或者让我们以这种方式提出问题:我可以自动 select 编辑 UIPickerView 的默认行,而不用手指 select 编辑特定行吗?
对我试图完成的事情的补充说明: 当用户单击文本字段时,将打开一个包含三列的 UIPickerView。在第一个轮子中,用户 select 是一个介于 0 和 16 之间的数字,在第二个轮子中,他将 select 一个分数,在第三个轮子中,他将是一个测量单位。例如: 1 1/2 杯, 1 盎司, 1/2 杯, 等等 根据数字和分数 selection,第三个选择器轮中的单位名称将以单数或复数拼写显示(1 杯对 2 杯)。只要触摸前两个轮子并完成物理 selection,整个事情就会完美地进行。问题:让我们以用户想要 select “1 盎司”为例。他会将第一个轮子移动到 1,将第二个轮子单独放置(因为它已经定位在 0 上),然后选择 "ounces"。但是使用我的代码,第三个轮子不会更新为单数拼写。只有,如果我真的移动第二个轮子并回到0。然后第三个轮子立即改变。
谢谢!!
这是我目前的代码:
_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;
}
}
是的,您可以自动 select 选择器的一行,而无需用手指触摸它。例如:
[self.pickerView selectRow:0 inComponent:2 animated:YES];
在视图出现在屏幕上之前调用它。大概在 viewWillAppear:
更新:
Markus 和我通过聊天检查了这个问题,然后我想出了一个解决方案。基本上,任何时候:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
被调用,如果它是组件 0 或 1,我们需要重新加载组件 2。我们这样做(在 didSelectRow 方法中)通过说:
[pickerView reloadComponent:2];
他的代码中还有其他一些小问题无法正常工作,但就此堆栈溢出问题而言,这就是所有需要解释的内容。
我最近遇到了同样的问题(uipickerview 没有 select 第一个值)。我试过..
[_myPicker selectRow:0 in Component:0 animated:YES];
但这仍然没有 select 值,它将选择器转到我在 select 行和组件中选择的任何内容,但没有将该值发送到任何地方。所以我所做的是在我的选择器数组中创建一个额外的行。我的选择器值为 1、2、3 和 4。所以当我添加数组时,它看起来像这样..
_myPickerArray = [[NSArray alloc] initWithObjects:@" ", @"1", @"2", @"3", @"4", nil];
现在用户必须将滚轮转到 select 某处。在您的代码中,您正在检查输入是否为 1 的字符串。如果它们 select space,则不会满足该条件。看看是否可行。