Получить все indexPaths в разделе - PullRequest
0 голосов
/ 16 мая 2018

Мне нужно перезагрузить раздел, исключая заголовок, после того, как я выполню какую-то сортировку по моим данным таблицы. То есть я просто хочу перезагрузить все строки в разделе. Но я не нахожу простой способ сделать это после того, как поищу некоторое время.

reloadSections(sectionIndex, with: .none) здесь не работает, поскольку он перезагрузит весь раздел, включая верхний и нижний колонтитулы и все строки.

Так что мне нужно использовать reloadRows(at: [IndexPath], with: UITableViewRowAnimation) вместо этого. Но как получить целые indexPath для всех строк в разделе.

Ответы [ 5 ]

0 голосов
/ 17 января 2019

Вы можете получить все видимые пути индекса напрямую, а затем отфильтровать их по своему желанию, т.е.

func reloadRowsIn(section: Int, with animation: UITableView.RowAnimation) {
    if let indexPathsToReload = indexPathsForVisibleRows?.filter({ $0.section == section }) {
        reloadRows(at: indexPathsToReload, with: animation)
    }
}
0 голосов
/ 16 мая 2018

Вы можете получить indexPath для повторной загрузки следующим образом ...

let indexPaths = tableView.visibleCells
    .compactMap { tableView.indexPath(for: $0) }
    .filter { $0.section == SECTION }

Нет необходимости перезагружать невидимые ячейки, так как они будут обновляться, когда cellForRow(at indexPath:) называется

0 голосов
/ 16 мая 2018

На мой взгляд, вам не нужно перезагружать целые ячейки в разделе.Просто перезагрузите ячейки, которые видны, а внутри раздела вам нужно перезагрузить.Перезагрузка невидимых ячеек бесполезна, потому что они будут исправлены при вызове 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)
0 голосов
/ 16 мая 2018

Итерируйте по индексным путям в разделе, используя метод numberOfRows inSection UITableView. Затем вы можете построить свой массив 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)
0 голосов
/ 16 мая 2018

Вы можете использовать функцию ниже, чтобы получить массив IndexPath в данном разделе.

func getAllIndexPathsInSection(section : Int) -> [IndexPath] {
    let count = tblList.numberOfRows(inSection: section);        
    return (0..<count).map { IndexPath(row: $0, section: section) }
}

Или

func getAllIndexPathsInSection(section : Int) -> [IndexPath] {
    return tblList.visibleCells.map({tblList.indexPath(for: $0)}).filter({($0?.section)! == section}) as! [IndexPath]
}
...