我试图从UITableView隐藏单元格。就像删除操作一样,但我只是想隐藏它以便稍后在同一位置显示它。
我知道UITableViewCell有一个名为" Hidden"但是当我使用这个属性隐藏Cell时,它会隐藏但没有动画,它们会留下一个空白区域
示例:
当我隐藏第二个小区时,第三个小区的位置可能会变为2?
感谢
答案 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 中,您需要做两件事,
隐藏您的手机。 (因为可重用的单元格可能会发生冲突)
将单元格的高度设置为 ZERO 。
看这里,
隐藏你的细胞。
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
}
将单元格的高度设置为 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
}
使用此功能可以消除可重复使用的单元冲突问题。
你也可以为 cell?.tag 做同样的事情来隐藏特定的单元格。
答案 2 :(得分:4)
您不能简单地隐藏UITableViewCell。您必须从表视图中删除该单元格,然后在希望它重新出现在表格中时再次插入它。
您要查找的方法是debug
和deleteRowsAtIndexPaths: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
}