隐藏 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 开发者,在这两者之间更改代码并不是什么大问题。 隐藏UITableViewCell
s 并手动设置它们的高度是个坏主意,因为它们由其父 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 单元格的主要内容,如果未能解决你的问题,请参考以下文章