遇到UIPickerView问题

时间:2016-01-18 21:24:25

标签: ios objective-c arrays uipickerview uisegmentedcontrol

因此,在使用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;控制器阵列的范围内。在我尝试访问所述数组中的任何数据之前,但无论出于何种原因,第二个组件想要访问未包含在数组中的索引。

0 个答案:

没有答案