尝试创建具有 3 列和不同行长的 UIPickerView

Trying to create a UIPickerView with 3 columns and different row lenghts

我正在尝试创建一个包含三列且每列的行数不同的 UIPickerView。选择器视图出现,但每列仅显示 3 个项目。我做错了什么?谢谢

_pickerData = @[ @[@"blanc", @"1/8", @"1/4", @"1/2", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10"],
                         @[@"blanc", @"1/8", @"1/4", @"1/2", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10"],
                         @[@"item 2", @"item 3", @"item 4", @"item 5", @"item 6", @"item 7", @"item 8", @"item 9", @"item 10"]];


// 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
{
    return _pickerData.count;
}

// 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
{
    return _pickerData[component][row];
}

您的选择器每列仅显示 3 个项目,因为 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 方法提供了这些项目。 return 从这个方法得到的数字是多少行将出现在给定的列(又名组件)中。您在这里返回 _pickerData.count,并且您的 _pickerData 数组中有 3 个项目,所以这是有道理的。请注意,数组的 "count" 计算数组中有多少个第一级对象 - 而不是每个对象中有多少个对象。

我想你想要做的是 return _pickerData[component].count 而不是 _pickerData.count。这将在您的选择器数据中获取一个特定的数组,并 return 该数组中的项目数,这似乎就是您要查找的内容。您已经在 pickerView:TitleForRow:forComponent 中做了类似的事情,所以我认为您已经理解了这个概念。快到了。

为了处理你的 'id' 警告,你可以转换对象来告诉编译器它正在处理哪种对象:

NSArray *array = (NSArray*)_pickerData[component];
return array.count;

问题出在pickerView:numberOfRowsInComponent:您在其中返回_pickerData 中的对象计数。根据您的数据,该计数将始终为 3 - 因为该数组包含 3 个数组。

您要做的是给出数组中与正在查看的组件相关的索引的项目数。所以你真正想要的是这样的:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return ((NSArray*)_pickerData[component]).count;
}

希望对您有所帮助。

您的代码应该在:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return _pickerData objectAtIndex:component.count;
}