0

I am getting error while moving expandable table view up and down. This is my error * Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSSingleObjectArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 0]'

arr = [[NSArray alloc]initWithObjects:@"obj1",@"obj2",@"obj3",@"obj4",nil];
arr1 = [[NSArray alloc]initWithObjects:@"Name1", @"name2", @"name3", @"name4", @"name5", @"name6", nil];
arr2 = [[NSArray alloc]initWithObjects:@"arr2obj", nil];
arr3 = [[NSArray alloc]initWithObjects:@"arr3obj", nil];
arr4 = [[NSArray alloc]initWithObjects:@"arr4obj", nil];

This is my code...

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:section]])
    {
        if (section == 0) {
            return arr1.count;
        } else if (section == 1) {
            return arr2.count ;
        } else if (section == 2) {
            return arr3.count;
        }else if (section == 3) {
            return arr4.count;
        }
    } else {

        return 0;
    }

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ViewControllerCell *cell; // = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell"];


    cell= (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell" forIndexPath:indexPath];

    cell.faqLbl.text = [tempArr objectAtIndex:indexPath.row];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    return cell;
}

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection: (NSInteger)section
{
    ViewControllerCellHeader *headerView = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCellHeader"];

    headerView.faqLblTitle.numberOfLines = 0;
    headerView.faqLblTitle.lineBreakMode = NSLineBreakByWordWrapping;
    headerView.faqLblTitle.font = [UIFont fontWithName:@"Helvetica-Bold" size:15.0];

    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
    {
        headerView.faqLblTitle.font = [UIFont fontWithName:@"Helvetica-Bold" size:25.0];

    }

    if (headerView ==nil)
    {
        [tblView registerClass:[ViewControllerCellHeader class] forCellReuseIdentifier:@"ViewControllerCellHeader"];

        headerView = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCellHeader"];
    }

    headerView.faqLblTitle.text = [arr objectAtIndex:section];

    if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:section]])
    {
        headerView.faqBtnShowHide.selected = YES;
    }

    [[headerView faqBtnShowHide] setTag:section];
    headerView.faqBtnShowHide.tag = section;

    [[headerView faqBtnShowHide] addTarget:self action:@selector(btnTapShowHideSection:) forControlEvents:UIControlEventTouchUpInside];

    return headerView.contentView;
}

-(IBAction)btnTapShowHideSection:(UIButton*)sender
{
    if (!sender.selected)
    {
        [arrSelectedSectionIndex addObject:[NSNumber numberWithInteger:sender.tag]];

        sender.selected = YES;
    }else{
        sender.selected = NO;

        if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:sender.tag]])
        {
            [arrSelectedSectionIndex removeObject:[NSNumber numberWithInteger:sender.tag]];
        }
    }

    [tblView reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:UITableViewRowAnimationAutomatic];
    }

    - (IBAction)dropDownButton:(UIButton *)sender {

        if(sender.tag == 0) {
            tempArr = arr1;
        } else if (sender.tag == 1) {
            tempArr = arr2;
        } else if (sender.tag == 2) {
            tempArr = arr3;
        } else if (sender.tag == 3) {
            tempArr = arr4;
        }
}
Max Pevsner
  • 4,098
  • 2
  • 18
  • 32
Naresh
  • 16,698
  • 6
  • 112
  • 113

1 Answers1

0
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   if(indexPath.section == 0) {
        tempArr = arr1;
    } else if (indexPath.section == 1) {
        tempArr = arr2;
    } else if (indexPath.section == 2) {
        tempArr = arr3;
    } else if (indexPath.section == 3) {
        tempArr = arr4;
    }

    ViewControllerCell *cell; // = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell"];


    cell= (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell" forIndexPath:indexPath];

    cell.faqLbl.text = [tempArr objectAtIndex:indexPath.row];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    return cell;
}

You were calling reload section without initializing tempArr numberOfRowsInSection is considering the actual data sources like arr1,arr2 etc but cellForRowAtIndexPath is depending on tempArr to populate cell. Obviously if tempArr's value is not same as the actual data source which returned the number of cells it will break.

Sandeep Bhandari
  • 19,999
  • 5
  • 45
  • 78