隐藏UITableview单元格

时间:2015-04-27 03:22:55

标签: ios objective-c uitableview

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

我知道UITableViewCell有一个名为" Hidden"但是当我使用这个属性隐藏Cell时,它会隐藏但没有动画,它们会留下一个空白区域

示例:

  1. 第一个小区
  2. 第二个小区
  3. 第三个细胞
  4. 当我隐藏第二个小区时,第三个小区的位置可能会变为2?

    感谢

10 个答案:

答案 0 :(得分:22)

使用动画有效“隐藏”行而不实际删除它的一种方法是将其高度设置为零。您可以通过覆盖-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];

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

答案 1 :(得分:18)

SWIFT 中,您需要做两件事,

  1. 隐藏您的手机。 (因为可重用的单元格可能会发生冲突)

  2. 将单元格的高度设置为 ZERO

  3. 看这里,

    1. 隐藏你的细胞。

      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      
      var myCell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("cellID",forIndexPath: indexPath) as? UITableViewCell
      
      if(indexPath.row == 1){
          myCell?.hidden = true
      }else{
          myCell?.hidden = false
       }
      
      return myCell       
      }
      
    2. 将单元格的高度设置为 ZERO

      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
      }
      
    3. 使用此功能可以消除可重复使用的单元冲突问题。

      你也可以为 cell?.tag 做同样的事情来隐藏特定的单元格。

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

答案 2 :(得分:4)

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

您要查找的方法是debugdeleteRowsAtIndexPaths:withRowAnimation:。这些在UITableView文档here中有详细记录。您将不得不记住从中取出单元格的位置,然后将其插入相同位置。

请记住,如果使用比删除行的行索引更小的行索引向表中添加单元格,则必须添加到索引以保持其相对位置。

希望这有帮助。

答案 3 :(得分:2)

我在TableViewCell的属性检查器中使用隐藏 - > 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)
}

答案 4 :(得分:2)

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 :(得分:1)

您应该删除行和重新加载表视图 [tbv reloadData];

答案 6 :(得分:0)

单元格显示,具体取决于数据源,因此您需要处理数据源。

如果dataArr是表视图数据源,首先,你应该删除单元格所在的数据源,然后

[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];

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

在条件检查中设置 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
       

} `

答案 9 :(得分:-2)

      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

        }