因此,在使用UIPickerView时出现了一个奇怪的错误。在进入代码之前,应用程序的基本说明是有序的:
此应用使用UISegmentedControl从几种不同的可能性中进行选择。根据分段控件的选择,UIPickerView将填充不同的数组。选择器视图保证有两个(不多,不少)组件。阵列的大小不同,这是我遇到障碍的地方。我在代码中设置了一些测试,以保持值在数组的范围内,但有些东西不能正常工作。
现在进入代码:
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
NSMutableArray *array;
int x = self.segmentController.selectedSegmentIndex;
if (x == 0) {
array = [NSMutableArray arrayWithArray:self.length];
}
else if (x == 1) {
array = [NSMutableArray arrayWithArray:self.time];
}
else if (x == 2) {
array = [NSMutableArray arrayWithArray:self.speed];
}
//component == 0 has no problems whatsoever
if (component == 0) {
if (row < [array count]){
self.label1.text = [array objectAtIndex:row];
self.component0 = row;
}
else {
self.label1.text = [array objectAtIndex:[array count] - 1];
self.component0 = (NSInteger)([array count] - 1);
}
}
//component == 1 has problems, it always thinks that the row number is less than the array count
else if (component == 1) {
if (row < [array count]){
self.label2.text = [array objectAtIndex:row];
self.secondComponent = row;
}
else {
self.label2.text = [array objectAtIndex:[array count] - 1];
self.secondComponent = (NSInteger)([array count] - 1);
}
}
else {
NSLog(@"ERROR: Components out of range");
}
//If I comment out this part, the program works as expected
if (x == 0) {
[self convertLength];
}
else if (x == 1) {
[self convertTime];
}
else if (x == 2) {
[self convertSpeed];
}
}
尝试从数组中读取值时出现错误,这是错误:
*由于未捕获的异常终止应用&#39; NSRangeException&#39;,原因:&#39; * - [__ NSArrayM objectAtIndex:]:索引8超出范围[0 .. 7] &#39;
当我进入第二段(时间)并在第二个组件上一直滚动到底部时,我收到此错误,然后转到第一个索引。 如果我尝试用第一个组件做同样的事情,它的工作方式与它应该完全一致,因此我很困惑,因为我基本上使用完全相同的代码来控制这两个组件。
这是我加载/重新加载选择器视图的方式:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {
int x = 0;
if (self.segmentController.selectedSegmentIndex == 0) {
x = [self.length count];
}
else if (self.segmentController.selectedSegmentIndex == 1)
{
x = [self.time count];
}
else if (self.segmentController.selectedSegmentIndex == 2)
{
x = [self.speed count];
}
return x;
}
- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSString *string;
NSArray *array = [[NSArray alloc] init];
if (self.segmentController.selectedSegmentIndex == 0) {
array = [NSArray arrayWithArray:self.length];
}
else if (self.segmentController.selectedSegmentIndex == 1)
{
array = [NSArray arrayWithArray:self.time];
}
else if (self.segmentController.selectedSegmentIndex == 2)
{
array = [NSArray arrayWithArray:self.speed];
}
if (row >= [array count]) {
string = [array objectAtIndex:[array count] - 1];
NSLog(@"Out of Range");
}
else {
string = [array objectAtIndex:row];
}
return string;
}
- (IBAction)segmentDidChange:(id)sender {
[self.pickerView reloadAllComponents];
[self pickerView:self.pickerView didSelectRow:self.component0 inComponent:0];
[self pickerView:self.pickerView didSelectRow:self.secondComponent inComponent:1];
}
其他有用信息: 长度数组:8 时间数组:9 速度数组:8
当我记录变量时,它们的行为与预期的一样,它们将它们的值改变到&#34;控制器阵列的范围内。在我尝试访问所述数组中的任何数据之前,但无论出于何种原因,第二个组件想要访问未包含在数组中的索引。