隐藏 UITableview 单元格

Posted

技术标签:

【中文标题】隐藏 UITableview 单元格【英文标题】:Hide UITableview cell 【发布时间】:2015-04-27 03:22:54 【问题描述】:

我正在尝试从 UITableView 中隐藏一个单元格。就像删除操作一样,但我只是想隐藏它以便稍后在相同的位置显示它。

我知道 UITableViewCell 有一个名为“隐藏”的属性,但是当我使用此属性隐藏单元格时,它会隐藏但没有动画,它们会留下一个空白空间

例子:

    第一个单元格 第二个单元格 第三格

有可能当我隐藏第二个单元格时,第三个单元格的位置更改为 2 ?

谢谢

【问题讨论】:

可以在特定位置添加单元格,和删除一样,看看***.com/questions/19503958/… 您需要先移除单元格,然后再插入单元格。 UITableView 有带有动画选项的插入/删除单元格方法,但是在使用这些方法时您必须自己管理数据源。 developer.apple.com/library/ios/documentation/UIKit/Reference/…: 我想你正在寻找这个。 ***.com/a/28020367/3411787 您提到的hidden 属性实际上在UIView 上,因此您可以隐藏任何视图。然而,这只是使其不可见,它不会更新 UITableView 的行高。 【参考方案1】:

用动画有效地“隐藏”一行而不实际删除它的一种方法是将其高度设置为零。你可以通过覆盖-tableView:heightForRowAtIndexPath:来做到这一点。

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

    CGFloat height = 0.0;
    if (isRowHidden) 
        height = 0.0;
     else 
        height = 44.0;
    
    return height;

(当然,您只想为要隐藏的特定行返回 0.0,而不是无条件地返回)。

简单地改变这个方法的返回值不会让表格视图自动调整行高,为了做到这一点,你需要进行以下调用。

isRowHidden = YES;
[tableView beginUpdates];
[tableView endUpdates];

如果这样做,您将看到两者之间的动画出现/消失过渡。

【讨论】:

不确定为什么会被接受。这将隐藏所有行(或不隐藏)。 对不起,我的意思是你不会对表格视图中的 all 行执行此操作,而只是要显示/隐藏的行。我应该说得更清楚。会更新。 您只希望特定行(或行)的高度为零。如所写,您为所有行或没有行返回零高度。 正如所写的那样,它仅适用于 isRowHidden 评估为 YES 的行,我已将其细节留给读者。 为了让答案更容易理解,只需将 isRowHidden 更改为 isRowHidden[indexPath.row]。这样,根据编码器定义/设置的布尔数组显示/隐藏行。【参考方案2】:

SWIFT中你需要做两件事,

    隐藏您的单元格。 (因为可重复使用的单元格可能会发生冲突)

    将单元格的高度设置为

看这里,

    隐藏单元格

    func tableView(tableView: UITableView, 
                   cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    
       let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    
       if indexPath.row == 1 
           cell?.hidden = true
        else 
           cell?.hidden = false
       
       return cell      
    
    

    将单元格的高度设置为

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    
        var rowHeight:CGFloat = 0.0
    
        if(indexPath.row == 1)
            rowHeight = 0.0
         else 
            rowHeight = 55.0    //or whatever you like
        
        return rowHeight
    
    

使用它可以消除可重复使用的单元冲突问题。

您可以对 cell?.tag 执行相同的操作,也可以按标签隐藏特定单元格。

参考:https://***.com/a/28020367/3411787

【讨论】:

问题被标记为 Objective-C,而不是 Swift。答案应使用适当的语言。 对,但作为 iOS 开发者,在这两者之间更改代码并不是什么大问题。 隐藏 UITableViewCells 并手动设置它们的高度是个坏主意,因为它们由其父 UITableView 管理和回收。如果您更改单元格的属性,例如隐藏它,它将在被其 UITableView 回收时保持隐藏状态。 @TimJohnsen ,请执行你所说的,然后尝试滚动你的tableview,你会知道事实的。 您仍然不应该隐藏表格视图单元格。【参考方案3】:

您不能简单地隐藏 UITableViewCell。您必须从表格视图中删除该单元格,然后当您希望它重新出现在表格中时再次插入。

您正在寻找的方法是deleteRowsAtIndexPaths:withRowAnimation:insertRowsAtIndexPaths:withRowAnimation:。这些在 UITableView 文档here 中有详细记录。您将不得不记住您从哪里删除了单元格,然后将其插入到相同的位置。

请记住,如果您将单元格添加到表中,其行索引小于已删除行的行索引,则必须添加到索引中以保持其相对位置。

希望这会有所帮助。

【讨论】:

【参考方案4】:

与Zaid Pathan 相同,但适用于 Swift 4:

    //HIDE you cell.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: NSIndexPath) -> UITableViewCell 

    let myCell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath) as! UITableViewCell

    //hide second cell
    indexPath.row == 1 ? (cell.isHidden = true): (cell.isHidden = false)

    return myCell       



//Set Height of cell to ZERO.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

    var rowHeight:CGFloat = 0.0
    indexPath.row == 1 ? (rowHeight = 0.0): (rowHeight = 49.0)
return rowHeight

【讨论】:

【参考方案5】:

如果您希望其他单元格具有动态高度:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        if indexPath.row == 1  // Or any other row
            return 0
        
        return -1.0
    

【讨论】:

谢谢。一直在寻找这个答案【参考方案6】:

我在 TableViewCell 的 Attributes Inspector 中使用 Hidden -> ContentView 然后实现方法:

   override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

    if shouldHideSection(indexPath.section) 
        return 0.0
     else if let isHidden = tableView.cellForRow(at: indexPath)?.contentView.isHidden, isHidden 
        return 0.0
    

    return super.tableView(tableView, heightForRowAt: indexPath)

【讨论】:

我喜欢这个解决方案,但在调用 cellForRow 时似乎遇到了溢出错误【参考方案7】:

您应该删除行并重新加载表格视图 [tbv 重载数据];

【讨论】:

需要注意的是,这将隐藏或显示行没有动画。【参考方案8】:

单元格显示,取决于数据源,所以需要处理数据源。

如果dataArr是表格视图数据源,首先要删除cell所在的数据源,然后

[dataArr removeObjectAtIndex:indexpath.row];
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

最后,你可以在需要添加单元格的时候插入数据源

[dataArr insertObjectAtIndex:indexpath.row];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

【讨论】:

【参考方案9】:

在条件检查中设置 rowHeight 值的最佳方法

存储值的数据数组。

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    //set up here
    
     let cell = myTableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)  as! myCustomCell
    
    
    if (dataArray?[indexPath.row].somevalue == "true")
    
        cell.isHidden = true
        tableview.rowHeight = 0.0
      
    
    else
    // show cell values 
     tableview.rowHeight = 130
       

`

【讨论】:

【参考方案10】:
      func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

             let dicttemp : Dictionary = arrAllCoursesList[indexPath.row] as! Dictionary<String,Any>

             var rowHeight:CGFloat = 0.0

             if let getStatus = dicttemp["status"] as? String
             
                if getStatus == "1"
                
                    rowHeight = 240.0
                
                else
                
                     rowHeight = 0.0
                
             

            return rowHeight

        


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

             let cell =  tableView.dequeueReusableCell(withIdentifier: "CompetitionTableViewCell") as! CompetitionTableViewCell

            let dicttemp : Dictionary = arrAllCoursesList[indexPath.row] as! Dictionary<String,Any>

  if let getStatus = dicttemp["status"] as? String
            
                if getStatus == "1"
                
                    cell.isHidden = false
                
                else
                
                    cell.isHidden = true
                
            


            cell.selectionStyle = UITableViewCellSelectionStyle.none
            return cell

        

【讨论】:

虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案 - From Review

以上是关于隐藏 UITableview 单元格的主要内容,如果未能解决你的问题,请参考以下文章

检查表格视图单元格是不是完全可见

隐藏 UITableview 单元格

自行调整特定 UITableView 单元的大小

从 UITableView 隐藏单元格

如何在ios的UITableview中聚焦最后一个单元格

UITableView - 如何在拖放期间更改单元格的背景颜色?