获取一个section中的所有indexPaths
Get all indexPaths in a section
在对 tableview 数据进行排序后,我需要重新加载不包括 header 的部分。也就是说我只想重新加载该部分中的所有行。但是我找了一段时间没有找到简单的方法。
reloadSections(sectionIndex, with: .none)
在这里不起作用,因为它将重新加载整个部分,包括 header、页脚和所有行。
所以我需要改用reloadRows(at: [IndexPath], with: UITableViewRowAnimation)
。但是如何获取该部分中所有行的整个索引路径。
您可以使用以下函数获取给定部分中的 IndexPath 数组。
func getAllIndexPathsInSection(section : Int) -> [IndexPath] {
let count = tblList.numberOfRows(inSection: section);
return (0..<count).map { IndexPath(row: [=10=], section: section) }
}
或
func getAllIndexPathsInSection(section : Int) -> [IndexPath] {
return tblList.visibleCells.map({tblList.indexPath(for: [=11=])}).filter({([=11=]?.section)! == section}) as! [IndexPath]
}
在我看来,您不需要重新加载该部分中的整个单元格。简单地说,重新加载可见的单元格和您需要重新加载的内部部分。重新加载不可见的单元格是无用的,因为它们将在调用 tableView(_:cellForRowAt:)
时被修复。
试试我下面的代码
var indexPathsNeedToReload = [IndexPath]()
for cell in tableView.visibleCells {
let indexPath: IndexPath = tableView.indexPath(for: cell)!
if indexPath.section == SECTION_INDEX_NEED_TO_RELOAD {
indexPathsNeedToReload.append(indexPath)
}
}
tableView.reloadRows(at: indexPathsNeedToReload, with: .none)
使用 UITableView 的 numberOfRows inSection 方法迭代一个部分中的索引路径。然后你可以构建你的 IndexPath 数组:
var reloadPaths = [IndexPath]()
(0..<tableView.numberOfRows(inSection: sectionIndex)).indices.forEach { rowIndex in
let indexPath = IndexPath(row: rowIndex, section: sectionIndex)
reloadPaths.append(indexPath)
}
tableView.reloadRows(at: reloadPaths, with: UITableViewRowAnimation)
你可以这样获取重载的indexPaths…
let indexPaths = tableView.visibleCells
.compactMap(tableView.indexPath)
.filter { [=10=].section == SECTION }
不需要重新加载不可见的单元格,因为它们会在调用 cellForRow(at indexPath:)
时更新
您可以直接获取所有可见的索引路径,然后根据需要进行过滤,即
func reloadRowsIn(section: Int, with animation: UITableView.RowAnimation) {
if let indexPathsToReload = indexPathsForVisibleRows?.filter({ [=10=].section == section }) {
reloadRows(at: indexPathsToReload, with: animation)
}
}
在对 tableview 数据进行排序后,我需要重新加载不包括 header 的部分。也就是说我只想重新加载该部分中的所有行。但是我找了一段时间没有找到简单的方法。
reloadSections(sectionIndex, with: .none)
在这里不起作用,因为它将重新加载整个部分,包括 header、页脚和所有行。
所以我需要改用reloadRows(at: [IndexPath], with: UITableViewRowAnimation)
。但是如何获取该部分中所有行的整个索引路径。
您可以使用以下函数获取给定部分中的 IndexPath 数组。
func getAllIndexPathsInSection(section : Int) -> [IndexPath] {
let count = tblList.numberOfRows(inSection: section);
return (0..<count).map { IndexPath(row: [=10=], section: section) }
}
或
func getAllIndexPathsInSection(section : Int) -> [IndexPath] {
return tblList.visibleCells.map({tblList.indexPath(for: [=11=])}).filter({([=11=]?.section)! == section}) as! [IndexPath]
}
在我看来,您不需要重新加载该部分中的整个单元格。简单地说,重新加载可见的单元格和您需要重新加载的内部部分。重新加载不可见的单元格是无用的,因为它们将在调用 tableView(_:cellForRowAt:)
时被修复。
试试我下面的代码
var indexPathsNeedToReload = [IndexPath]()
for cell in tableView.visibleCells {
let indexPath: IndexPath = tableView.indexPath(for: cell)!
if indexPath.section == SECTION_INDEX_NEED_TO_RELOAD {
indexPathsNeedToReload.append(indexPath)
}
}
tableView.reloadRows(at: indexPathsNeedToReload, with: .none)
使用 UITableView 的 numberOfRows inSection 方法迭代一个部分中的索引路径。然后你可以构建你的 IndexPath 数组:
var reloadPaths = [IndexPath]()
(0..<tableView.numberOfRows(inSection: sectionIndex)).indices.forEach { rowIndex in
let indexPath = IndexPath(row: rowIndex, section: sectionIndex)
reloadPaths.append(indexPath)
}
tableView.reloadRows(at: reloadPaths, with: UITableViewRowAnimation)
你可以这样获取重载的indexPaths…
let indexPaths = tableView.visibleCells
.compactMap(tableView.indexPath)
.filter { [=10=].section == SECTION }
不需要重新加载不可见的单元格,因为它们会在调用 cellForRow(at indexPath:)
时更新
您可以直接获取所有可见的索引路径,然后根据需要进行过滤,即
func reloadRowsIn(section: Int, with animation: UITableView.RowAnimation) {
if let indexPathsToReload = indexPathsForVisibleRows?.filter({ [=10=].section == section }) {
reloadRows(at: indexPathsToReload, with: animation)
}
}