重新加载tableView部分而不重新加载标题部分 - Swift

时间:2015-09-07 14:21:09

标签: ios swift uitableview

我正在尝试重新加载tableView部分而不是重新加载整个tableview,因为我在标题部分有一个文本字段,当我调用self.tableView.reloadData()时我的键盘被关闭。

我已尝试过以下代码,但收到此错误Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 5 from section 2 which only contains 4 rows before the update'请问我的问题在哪里?

    let newCount = self.placeArray.count

    var newIndexPaths = NSMutableArray(capacity: newCount)

    for var i = 0 ; i < newCount ; i++ {
    var indexPath = NSIndexPath(forRow: i, inSection: 2)
        newIndexPaths.addObject(indexPath)
    }

    self.tableView.beginUpdates()
    self.tableView.reloadRowsAtIndexPaths(newIndexPaths as [AnyObject], withRowAnimation: UITableViewRowAnimation.None)
    self.tableView.endUpdates()

6 个答案:

答案 0 :(得分:40)

您可以改用UITableView reloadSections方法。

tableView.reloadSections(NSIndexSet(index: 2), withRowAnimation: .None)

答案 1 :(得分:23)

Swift 3.0.1:

let sectionIndex = IndexSet(integer: 0)

tableView.reloadSections(sectionIndex, with: .none) // or fade, right, left, top, bottom, none, middle, automatic

答案 2 :(得分:8)

Swift 3.1 Xcode 8.3.3答案:)

问题是 - 每个部分当然都包含标题,因此部分为:

section = header + footer + rows

回答是 - 由IndexPath直接重新加载行。 例如:

  1. 我们假设您的表格中有 1个部分,并且&#39;数组&#39;你用作表格数据源的东西:

    let indexes = (0..<array.count).map { IndexPath(row: $0, section: 0) }

  2. 现在我们已经有了要重新加载的单元格索引数组,所以:

    tableView.reloadRows(at: indexes, with: .fade)

答案 3 :(得分:3)

我不知道为什么错误的答案会得到如此多的赞成。

注意:

  • UITableView.reloadData()将重新加载所有表格。 Docs about reloaddata

      

    重新加载用于构造表的所有数据,包括   单元格,节页眉和页脚,索引数组等。对于   效率,表视图只重新显示那些行   可见。如果表因此而缩小,它会调整偏移量   重装。表视图的委托或数据源调用此方法   当它希望表视图完全重新加载其数据时。

  • UITableView.reloadSections(_ sections: IndexSet, with animation: UITableViewRowAnimation)将重新加载特定部分(包括部分标题和部分页脚)。 Docs about reloadsections

  • UITableView.reloadRows(at indexPaths: [IndexPath], with animation: UITableViewRowAnimation)将重新加载指定的行。 Docs about reloadRows

所以这里reloadSections不起作用。 如果您的标题部分数据和状态没有变化,请调用此方法,看不出任何差异。

解决方案:使用reloadRows加载所有部分或特定部分的行。 注意:此处您只需加载可见行,滚动查看时将加载其他行。您还可以参考Get all indexPaths in a section了解更多解决方案

var indexPaths = self.tableView.indexPathsForVisibleRows

/* just roload visible rows of specified section
indexPaths = indexPaths.filter({ (indexPath) -> Bool in
    return indexPath.section == SECTION_INDEX_NEED_TO_RELOAD
})
*/
self.tableView.reloadRows(at: indexPaths!, with: .none)

答案 4 :(得分:3)

快捷键5

您可以重新加载以下部分:

tableView.reloadSections([0], with: .none)

tableView.reloadSections(IndexSet(integer: 0), with: .none)

此处表示它将重新加载的索引。

重新加载多个部分:

tableView.reloadSections([0, 1, 3], with: .none)

答案 5 :(得分:0)

雨燕5

  

这里放置了静态索引重载,它是第一个索引,您可以根据需要进行更改。

self.tblView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: .none)