如何在按钮单击同一单元格内时隐藏/显示自定义tableview单元格内的特定视图

时间:2016-09-14 06:51:57

标签: ios objective-c uitableview row-height

  • 我有一个table view(例如:20行)。我使用了custom table view cell table view

  • 在此table view cell中,有labels,一个buttonhidden view (UIView)

  • 我在buttonaction hide/show写了hidden view custom table view cell class。它运行正常。但它影响到其他{{} 1}}在表格视图中。这意味着,当我点击第一行中的按钮时,隐藏的视图显示,并且在rows时,它可以在表格视图的其他一些行中看到。

  • 同时(scroll down时),我想hide/showincrease行高(仅点击行/单元格)。出了什么问题。下面是我的代码和一些屏幕截图,以获得一个想法。

this is the first row when click in expand button

at the same time when I scroll, this is the look of other rows/cell, the show the hidden view without clicking on expand button

注意:当单击每个单元格中的展开按钮时,单元格会自动展开/增加。

这是decrease类中hideshow的{​​{1}}。

hidden view

出了什么问题,希望你对此有所帮助。

高级:如果有单向隐藏/显示和扩展(增加行高)单击每个单元格的展开按钮,那就太棒了。

7 个答案:

答案 0 :(得分:3)

为我自己找到适合的解决方案。感谢所有支持我的人。

执行以下操作。

  1. NSMutableArray Which中创建button以保留Which row clicked
  2. 然后,当用户点击Button中的Custom table view cell时,检查index path中的alreadymutable array,如果是already在其中,然后romove,否则添加它。
  3. 然后在cellforrowatindexpath方法中,检查nsmutable array并检查indexpath.rowexist还是not
  4. 最后,如果是exists,请不要隐藏,否则hide,这完美无缺。
  5. 这是表视图的实现。 .m档案

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return 25;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        FirstTableViewCell *cells = [tableView dequeueReusableCellWithIdentifier:@"tvcell" forIndexPath:indexPath];
    
        NSString *theIndexpath = [NSString stringWithFormat:@"%ld", (long)indexPath.row];
    
    //here check whether it is exists or not.
            if ([chekcme containsObject:theIndexpath])
            {
                cells.insideCollectionView.hidden = false;
            }
            else
            {
                cells.insideCollectionView.hidden = true;
            }
    
    
    
        [cells setColletionData:bbarray];
    
        [cells.expandMe addTarget:self action:@selector(runs:) forControlEvents:UIControlEventTouchUpInside];
    
    //in here set the tag of the button to indexpath.row
        cells.expandMe.tag = indexPath.row;
    
    
        return cells;
    }
    
    //this is the action for the button inside the custom tableview cell.
    - (IBAction)runs:(UIButton *)sender{
    
        NSString *myob = [NSString stringWithFormat:@"%li", (long)sender.tag];
        NSLog(@"%@",myob);
    
        if ([chekcme containsObject:myob]) {
            [chekcme removeObject:myob];
        }
        else
        {
            [chekcme addObject:myob];
        }
    
    
        NSLog(@"%@", chekcme);
    
    //keep in mind to reload the table view here.
        [self.maintableView reloadData];
    }
    
      

    注意:checkme是NSMutableArray,用于保存用户点击的对象。

答案 1 :(得分:1)

第1步: - 假设您在标签值,按钮和隐藏视图等行中显示数据。在数组ex中添加一个参数。 isViewNeedToShow ,默认填写该值 FALSE

第2步: - 在您的按钮操作之后,您将indexPath.row作为索引路径中行的单元格中的标记值传递,因此在按钮操作中更改数组值参数 isViewNeedToShow == TRUE ,然后重新加载表格视图的部分。例如: -

Item *tempItem              = yourArray[sender.tag];
tempItem. isViewNeedToShow  = tempItem. isViewNeedToShow ? FALSE : TRUE;

**For particular row update** :- 

 [yourTableView beginUpdates];
 [yourTableView reloadRowsAtIndexPaths:@[sender.tag, 0] withRowAnimation:UITableViewRowAnimationNone];
 [yourTableView endUpdates];

第3步: - 如果要展开表格单元格,则必须计算包含视图,标签等项目的行高。

Or if you are using auto layouts in your project use UI Table View Delegate Methods

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

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

我希望您的问题能得到解决。

答案 2 :(得分:0)

我需要在tableview数据源方法中查看代码,但我认为以下内容可以解决您的问题:

问题#1:我假设您正在为您的单元格使用deque,这会导致在滚动时重复使用单元格。我建议你保持每个单元格的状态(例如:isExpanded)并在cellForRowAtIndex中相应地配置单元格:

问题#2:使用相同的' IsExpanded'在heightForRowAtIndex:并在状态更改为#E; IsExpanded'

时,为您的单元格调用reloadRowsAtIndexPaths:

答案 3 :(得分:0)

您需要重新加载所有表而不是单个单元格  你可以使用下面的代码

 tbl_name .beginUpdates(
 tbl_name .endUpdates()

<强>更新

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

   if indexPath.row == userselectedrow // save selectecd cell index  if you want to only one cell expand otherwise save selected row in array and compare to here
        {
             return incrementheight // increment row height here
        }
        else
        {
          return decrementheight // decrement row height
        }      

    }

- (IBAction)hideshow:(UIButton*)sender {
 CGPoint point11=[sender convertPoint:CGPointZero toView:tbl_calender];
   NSIndexPath index_pathGlobal =[tbl_calender indexPathForRowAtPoint:point11]; // save index_pathGlobal
}

希望这会对你有所帮助

答案 4 :(得分:0)

您应该首先在cellForRowAtIndexPath中设置有关视图的状态。希望它会对你有所帮助。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

// here you have to maintain the status about the current cell. whether it is hidden or not.
    cell.insideCollectionView.hidden = status;
    }

答案 5 :(得分:0)

该按钮会影响多个rows,因为您将BOOL存储在collectionView的{​​{1}}中。

cell重新用于其他cell时,rowcell根据之前用于的hidden/shown的状态row。正如已经建议的那样,您需要为state的每一个rows存储此cell,并在dataSource准备#include <stdio.h> main() { int LA[] = {1,3,5,7,8}; int item = 10, k = 3, n = 5; int i = 0, j = n; printf("The original array elements are :\n"); for(i = 0; i<n; i++) { printf("LA[%d] = %d \n", i, LA[i]); } n = n + 1; while( j >= k){ LA[j+1] = LA[j]; j = j - 1; } LA[k] = item; printf("The array elements after insertion :\n"); for(i = 0; i<n; i++) { printf("LA[%d] = %d \n", i, LA[i]); } } 时进行相应设置。

答案 6 :(得分:0)

我正在做同样的事情: 在didSelect中

  switch selectedIndexPath {
    case nil:
        selectedIndexPath = indexPath
    default:
        if selectedIndexPath! == indexPath {
            selectedIndexPath = nil
        } else {
            selectedIndexPath = indexPath
        }
    }
  tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

行高

if selectedIndexPath != nil {
        if selectedIndexPath == indexPath {
            return estimatedHeight
        }
    }
    return 44

selectedIndexPath是NSIndexPath的一个属性。 希望这可以帮到你。