使用2个自定义单元格在UITableView上进行索引超出界限

时间:2014-01-30 18:07:35

标签: ios objective-c uitableview nsfetchedresultscontroller

我在UITableView上显示2个自定义单元格。我正在显示它们:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"StepsViewCell";
    static NSString *simpleTableIdentifier2 = @"descViewCell";

    if( indexPath.row == 0 ) {
        UITableViewCell *cell = nil;
        cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier2];
        if( !cell ) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"descViewCell" owner:self options:nil];
                cell = [nib objectAtIndex:0];
            }
            cell.textLabel.text = [descLabel objectAtIndex:indexPath.row];

            return cell;
    }
        else {
            StepViewCell *cell = nil;
            cell = (StepViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
            if( !cell ) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"StepsViewCell" owner:self options:nil];
                cell = [nib objectAtIndex:0];
            }

            cell.stepTextLbl.text = [stepLabel objectAtIndex:indexPath.row];
            [cell.thumbImage setImage:[UIImage imageNamed: @"full_breakfast.jpg"] forState:UIControlStateNormal];

            return cell;
            }
        }

我使用下面的代码计算它们,因为descViewCell始终为1。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return [stepLabel count] +1;
}

这是有效的,但是当我向下滚动到UITableView的底部并且它崩溃时,我得到index (5) beyond bounds (5)。我做错了什么?

2 个答案:

答案 0 :(得分:4)

这是因为在- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section中,您为返回的结果添加了1。所以你的stepLabel数组有5个元素(在索引0 - 4处)。但是当你为这个数字加1时,你的代码认为你有6行,它们在索引0 - 5处。所以你的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法试图从只有5个元素的数组的索引5访问数据(因此,在索引4)结束。

您可以对代码进行以下更改以修复此崩溃:

cell.stepTextLbl.text = [stepLabel objectAtIndex:indexPath.row-1];

我认为这将完成您正在尝试的内容,因为如果行大于0,它看起来只会进入代码的这一部分。因此,这会将值向下移动1,以便您访问索引为0 - 4的数组。

答案 1 :(得分:1)

您的stepLabel计数为5. numberOfRowsInSection:返回6.此行:

cell.stepTextLbl.text = [stepLabel objectAtIndex:indexPath.row];
当indexPath.row = 5时,

崩溃你的应用程序,因为没有stepLabel [5]。尝试使用

cell.stepTextLbl.text = [stepLabel objectAtIndex:(indexPath.row - 1)];