【问题标题】:iOS UITableView scrolling insets while filteringiOS UITableView在过滤时滚动插入
【发布时间】:2018-05-30 15:23:51
【问题描述】:

UITableView 滚动有一些问题。这是我的简单屏幕,其中有 UITextField 和 UITableView 以及单元格。当用户在 UITextField 中输入内容时,应用程序会过滤项目列表并重新加载 UITableView。它正在按预期工作。

在右侧屏幕上,您可以看到我滚动时 UITableView 的外观。单元格位于 UITextField 下。

假设我滚动了一些单元格,如果我开始在 UITextField 中输入内容,我会得到过滤单元格的列表,但其中一些在 UITextField 下,我无法向下滚动。

【问题讨论】:

  • 您的表格视图从文本字段下方还是文本字段下方开始?

标签: ios uitableview uiscrollview


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多