Obj-C - 展开选定的单元格,取消选中时折叠

Posted

技术标签:

【中文标题】Obj-C - 展开选定的单元格,取消选中时折叠【英文标题】:Obj-C - Expand selected cell, collapse when unselected 【发布时间】:2018-07-31 22:31:07 【问题描述】:

我正在尝试这样当我的用户点击一个单元格时,它会从高度 70 扩展到 165,当他们选择另一个单元格时,我希望之前选择的单元格折叠,而新选择的单元格展开。看起来应该很简单,但是当我使用下面的代码时,某些单元格有时会保持扩展,导致事情重叠?我该如何解决这个问题?

注意:我的 tableviewcell xib 是 165h(因为我想在单元格展开时显示的数据位于它的下半部分)

ViewController.m

  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    

        if([indexPath isEqual:[tableView indexPathForSelectedRow]]) 

            return 165.0;

        

        return 70.0;

    

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 


    [tableView beginUpdates];
    [tableView endUpdates];



【问题讨论】:

【参考方案1】:
@interface tableView ()

    NSInteger value;



@property(weak, nonatomic) NSIndexPath *selectedIndexPath;

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    value = 0;





- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    if(value == 1)
        value = 0;

    
    else
        value = 1;
    
    [self.tableView beginUpdates];
    _selectedIndexPath = indexPath;
    [self.tableView endUpdates];





- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    if (indexPath == _selectedIndexPath && value == 1) 

        return 285;
    
    else
        return 120;
    
    return 120;


希望有帮助!

【讨论】:

如果我的 xib 也设置为 70h,这将非常有效。也就是说,如果我希望标签出现在下拉部分中,我无法将我的 xib 设置为 165h 以使其正常工作。这对我来说没有意义,因为我应该如何在下拉列表的下半部分放置任何东西? 好吧,您需要在 xib 中获取单元格高度 = 165 并完成所有设计工作。在代码中,更改IMET 120 - > 70和285 - > 165.当代码运行时,它将将单元格的高度返回为70,但选择单元格时,它将返回高度为165 span> 试过了 - 出于某种原因,当我按照您上面所说的方式进行操作时(xib 在 165),即使没有选择它们,也会在 165 处返回一些选定的单元格:/ 嗯,这很奇怪,但它发生并且确实发生在我身上,我需要看到你的代码。如果方便,您可以将文件邮寄至 Hemant.garg@appcodeindia.com,或者您可以提供您的电子邮件 ID,我将向您发送一个虚拟项目【参考方案2】:

声明一个属性

@property NSIndexPath*index;

//

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    if(indexPath == self.index) 
        return 165.0;
    
    return 70.0;


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
      self.index = indexPath;
      [tableView reloadData];

//

查看Demo

【讨论】:

当我实现这个并打开我的表格视图时,我的 4 个单元格中的两个已经展开了?当我最终将它们全部关闭时,由于某种原因,我的最后一个牢房一直在扩大...... 您可能遗漏了一些东西,请查看使用相同代码的附加演示

以上是关于Obj-C - 展开选定的单元格,取消选中时折叠的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 子视图显示在单元格之外

保存、保留和检索数组中的选定单元格

使用向后滑动手势以交互方式取消选择选定单元格

快速展开/折叠单元格按钮单击

垂直和水平滚动collectionView选择单元格问题

展开和折叠表格视图单元格