gpt4 book ai didi

ios - UITableView 部分页脚在插入新表格行后移动

转载 作者:可可西里 更新时间:2023-11-01 05:28:33 26 4
gpt4 key购买 nike

我有一个显示项目列表的 UITableView。 TableView Controller 有一个项目数组,这些项目在响应对 Web 服务的调用时异步更新。这是我所拥有的示例(在 Swift 中):

class MyTableViewController : UITableViewController {
var items: [ItemClass] = []

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("RootCell", forIndexPath: indexPath) as UITableViewCell
if indexPath.section == 0 {
let item = items[indexPath.row]
cell.textLabel!.text = item.name
}
else if indexPath.section == 1 {
// Another section not shown here
}
return cell
}
}

我希望此表的每个部分都有一个带按钮的页脚,因此我还包括:

    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let button = UIButton.buttonWithType(.System) as UIButton
button.setTitle("Add", forState:UIControlState.Normal)
if section == 0 {
button.addTarget(self, action:Selector("itemAddPressed:"), forControlEvents:UIControlEvents.TouchUpInside)
}
else if section == 1 {
// other section not shown here
}
return button
}

通过在主 UI 线程之外调用的回调将项目添加到 items 数组。它看起来像这样:

private func itemWasAdded(item: ItemClass) {
dispatch_async(dispatch_get_main_queue()) {
self.items += [item]
self.tableView!.reloadData()
}
}

这一切都很好,但是当我知道一次只添加一个项目时,我对表的 reloadData 的使用对我来说似乎有点过分了。因此,我尝试更新它以执行以下操作:

private func itemWasAdded(item: ItemClass) {
dispatch_async(dispatch_get_main_queue()) {
self.items += [item]
let indexPath = NSIndexPath(forRow:self.item.count - 1, inSection:0)
self.tableView!.insertRowsAtIndexPaths([indexPath], withRowAnimation: .None)
}
}

当我这样做时,表格继续工作,但页脚按钮出现问题。我没有在每个部分的页脚中显示我创建的添加按钮,而是在 TableView 底部第 1 部分下方看到第 0 部分的添加按钮。

似乎做一些事情来强制刷新表格似乎可以解决问题。这个 UITableViewController 是 UINavigationController 中的顶级 Controller ,如果我选择一个表格单元格,一个新的 View Controller 将被推送到导航 Controller 上。导航回原来的 TableView Controller ,页脚按钮显示在正确的位置。

完成这项工作的最简单方法就是使用 reloadData 而不是 insertRowsAtIndexPaths。但我想知道我在这里做错了什么,这样我就可以避免重新加载所有表数据。

我是否在此处错误地使用了 insertRowsAtIndexPaths

最佳答案

我认为这是因为缺少 beginUpdates() 和 endUpdates() 而发生的,这将是一个非常简单的错误。但我在测试时遇到了完全相同的问题。

我将分享我的观察。

当我尝试使用 Tableview 样式分组时,上述问题没有发生。但是如果我使用 Plain 样式,页脚会下降到 tableview 的底部。我猜这与不同的页脚 View 行为有关,这取决于它的样式和 TableView 在更新其数据后布局其内容的方式。

如果您必须使用 Plain 样式的 tableview,则必须在插入行之前处理其内容高度(单元格和节页脚 View )的总和小于 tableview 高度的情况。类似的东西,

let contentHeight = CGFloat(items.count * cellHeight + numberOfSection*footerHeight)
if contentHeight < tableViewHeight {
tableView.frame = CGRectMake(0, 0, view.frame.size.width, numberOfSection*CGFloat(items.count * cellHeight + footerHeight))
} else {
tableView.frame = viewHeight
}

为了让一切变得干净,您应该了解具有不同样式和框架的表格 View 的节页脚/页眉的行为是什么。希望您能找到更符合您要求的解决方案。

关于ios - UITableView 部分页脚在插入新表格行后移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27791074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com