iOS UITableView在过滤时滚动插入
Posted
技术标签:
【中文标题】iOS UITableView在过滤时滚动插入【英文标题】:iOS UITableView scrolling insets while filtering 【发布时间】:2018-05-30 15:23:51 【问题描述】:UITableView 滚动有一些问题。这是我的简单屏幕,其中有 UITextField 和 UITableView 以及单元格。当用户在 UITextField 中输入内容时,应用程序会过滤项目列表并重新加载 UITableView。它正在按预期工作。
在右侧屏幕上,您可以看到我滚动时 UITableView 的外观。单元格位于 UITextField 下。
假设我滚动了一些单元格,如果我开始在 UITextField 中输入内容,我会得到过滤单元格的列表,但其中一些在 UITextField 下,我无法向下滚动。
【问题讨论】:
您的表格视图从文本字段下方还是文本字段下方开始? 【参考方案1】:默认情况下,当您使用新的行数据集重新加载表格时,表格的滚动偏移量不会改变。重新加载表格后,您需要滚动回顶部:
self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0),
at: .top,
animated: true)
如果在没有结果时没有默认的占位符单元格来表示“无匹配结果”,因此在索引 (0,0) 处没有要表示的单元格,则在上述代码之前添加以下条件保护崩溃:
guard cellResults.count > 0 else return
【讨论】:
谢谢,这段代码在两种情况下会发生什么 1) 没有要显示的单元格 - 它会崩溃吗? 2)如果我向下滚动以使索引为 0 的单元格不再出现(甚至不存在于内存中)怎么办?它应该可以正常工作吗? 是的,如果您的过滤器之后没有单元格,它将崩溃,因为这将尝试找到该单元格以转到表格的位置。因此,您应该在该代码之前添加一个检查“guard cellDataRows.count > 0 else return ”。你的第二点会很好。【参考方案2】:首先你的 UITextField 包含在 tableview 标题视图中? UITableView 是否需要滚动表格? 如果您需要在用户在 UITextField 中输入内容时始终显示第一个单元格,我推荐像这样使用 RxSwift
textField
.rx.text
.orEmpty
.debounce(0.1, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe(onNext: [unowned self] query in
//TODO: Do something with you table, for example
// self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
// or update tableView.
)
.disposed(by: disposeBag)
【讨论】:
UITextField 不是 TableView 的一部分。我认为添加 RxSwift 只是为了修复滚动是过多的 是的,你也可以使用 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool with UITextFieldDelegate以上是关于iOS UITableView在过滤时滚动插入的主要内容,如果未能解决你的问题,请参考以下文章