我在尝试将可扩展单元格实现到我的应用程序时遇到了很多问题。目前的问题是,虽然我的代码可以按照扩展和折叠单元格的方式工作,但它会显示刷卡时要隐藏的内容,这些内容看起来很糟糕。
另一个问题是,当我点击导航按钮以远离桌面视图时,其中一个单元格会展开。此外,当敲击一个单元格时,它似乎会松开顶部的分界线,直到敲击不同的单元格。 (这些问题比较轻微。提到的第一个问题更为重要。)
这是我在didSelectRowAtIndexPath中的代码:
var selectedRowIndex: NSIndexPath = NSIndexPath(forRow: -1, inSection: 0)
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
selectedRowIndex = indexPath
tableView.beginUpdates()
tableView.endUpdates()
}
这是我在heightForRowAtIndexPath中的代码:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
cellHeight = 68
if tableView != self.searchDisplayController?.searchResultsTableView {
if indexPath.row == selectedRowIndex.row {
if cellTapped == false {
cellTapped = true
cellHeight = 141
return 141
} else {
cellTapped = false
cellHeight = 68
return 68
}
}
}
return 68
}
在cellForRowAtIndexPath中:
if cellHeight == 141 {
cell.notesLabel.hidden = false
println("False")
} else if cellHeight == 68 {
cell.notesLabel.hidden = true
println("True")
}
目前,此代码似乎使cell.notesLabel 始终隐藏,因为在点击单元格时似乎没有调用cellForRowAtIndexPath。
有没有人能解决这个问题或更好的实施?我确信必须有一种更简单的方法。
答案 0 :(得分:1)
我会考虑调查自动调整大小的单元格。
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
随着您的内容发生变化,您必须重新加载单元格并为其设置动画,但我认为这将是一个更好的实现:
reloadRowsAtIndexPaths(_ indexPaths: [AnyObject], withRowAnimation animation: UITableViewRowAnimation)
听起来你有很多手势正在发生,这可能会导致你的问题。使用可拖动单元格,确保平移手势正在改变偏移量的contentView,或者如果您在视图中包含所有单元格内容,请确保将其应用于该视图。
答案 1 :(得分:0)
对于有兴趣解决此问题的人,这是我的解决方案。
变量selectedRowIndex跟踪用户点击的最后一行的indexPath.row。
标签1,标签2和标签3在单元格未处于展开状态时被单元格边界外的隐藏。
EditActionsForRowAt在用户滑动删除时被调用,因此此时我隐藏了当前未向用户显示的标签,因为它们超出了单元格的边界。有一些if语句用于检查标签是否应该隐藏。
var selectedRowIndex = -1
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == selectedRowIndex {
return 95 //Expanded
}
return 50 //Not expanded
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! MyTableViewCell
if selectedRowIndex == indexPath.row {
selectedRowIndex = -1
} else {
selectedRowIndex = indexPath.row
cell.label1.isHidden = false
cell.label2.isHidden = false
cell.label3.isHidden = false
}
tableView.reloadRows(at: [indexPath], with: .automatic)
}
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let cell = tableView.cellForRow(at: indexPath) as! MyTableViewCell
if indexPath.row != selectedRowIndex {
cell.label1.isHidden = true
cell.label2.isHidden = true
cell.label3.isHidden = true
}
return nil
}
希望能帮助别人!
丹