在tableview中有多个节时展开/折叠表行

时间:2016-09-01 07:04:47

标签: ios objective-c uitableview

这里我正在尝试创建展开/折叠表row.it在 didSelectRowAtIndexPath 中仅使用1个部分的代码正常工作:

if (selectedIndex == indexPath.row) {
            selectedIndex = -1;
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]withRowAnimation:UITableViewRowAnimationFade];
            return;
        }

        //for table view collapse
        if (selectedIndex != -1) {
            NSIndexPath *prePath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
            selectedIndex = (int)indexPath.row;
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:prePath, nil]withRowAnimation:UITableViewRowAnimationFade];
        }

        //for non selection
        selectedIndex = (int)indexPath.row;
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]withRowAnimation:UITableViewRowAnimationFade];

通过这段代码,我可以展开和折叠表格行,但是当且仅当表格中的1个部分但是当多个部分出现时,它会扩展每个部分特定的行。所以当我点击第0部分的第1行时将打开所有部分的第一行。 如何摆脱这种情况?

3 个答案:

答案 0 :(得分:1)

点击特定部分按钮,您可以更改行数。

在剖面视图中,您为所有部分添加了一个按钮,该按钮在点击时具有常用方法。

在点击方法中,您只需更改特定部分的bool变量值

    ex.. if sender tag you initials with section number. 
    So For Section 0 button is taped then in tapping method
     if sender.tag == 0  
   { 
       if section0tag
       {
        section0tag = false
       }
       else
       {
        section0tag = true 
       }
      table.reload() ..//Which call number of rows at section data source method
  }

 For number of rowsatSection method data source method

 if section == 0
   {
      if section0tag
        {
            return 5 //Expanding rows
        }
     else
       {
            return  0 //collapsing rows
       }
   }   

答案 1 :(得分:0)

尝试这种方法只需重新加载tableview(即rOne,rTwo等是bool值):

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section == 0) {
        return rOne ? oneRoundType.count : 0 ;
    }else if (section ==1) {
        return rTwo ? twoRoundType.count : 0 ;
    }else if (section ==2) {
        return rThree ? threeRoundType.count : 0 ;
    }else if (section ==3) {
        return rFour ? fourRoundType.count : 0 ;
    }else if (section ==4) {
        return rFive ? fiveRoundType.count : 0 ;
    }
    return 0;
}

答案 2 :(得分:0)

请尝试以下代码:

sectionIndexToBeExpanded为int的全局声明,以检查它是否已展开

int sectionIndexToBeExpanded;

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

   //Assign value 100 to sectionIndexToBeExpanded, if you do not want row expanded 
    sectionIndexToBeExpanded = 100;
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [yourArray count];    
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (sectionIndexToBeExpanded==100)  //If not expanded
    {
        return 1;
    }
    else if (sectionIndexToBeExpanded==section) //If section expand add one more row
    {
        return 2;
    }
    else
        return 1;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row==0)
    {
        if (sectionIndexToBeExpanded==100)    //If section not expanded set value of sectionIndexToBeExpanded to 100
        {
            UITableViewCell *cell=(UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath];

            [tableView beginUpdates];

            [tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationRight];
            sectionIndexToBeExpanded=(int)indexPath.section;

            [tableView endUpdates];

        }
        else if (sectionIndexToBeExpanded==indexPath.section)   // If Section is already expanded at indexpath then collapse ie. delete row
        {
            UITableViewCell *cell=(UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath];

             [tableView beginUpdates];

            [tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:indexPath.row+1 inSection:sectionIndexToBeExpanded]] withRowAnimation:UITableViewRowAnimationLeft];
            sectionIndexToBeExpanded=100;  //Set section to not expanded

            [tableView endUpdates];
        }
        else   //Expand section
        {
            UITableViewCell *cell=(UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath];
            [tableView beginUpdates];

            [tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:indexPath.row+1 inSection:sectionIndexToBeExpanded]] withRowAnimation:UITableViewRowAnimationLeft];

            //set value of expanded section to sectionIndexToBeExpanded
            sectionIndexToBeExpanded=(int)indexPath.section;

            [tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationLeft];

            [tableView endUpdates];

        }

    }

}

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}