【问题标题】:How to scroll UITableView to a row *safely*?如何*安全*地将 UITableView 滚动到一行?
【发布时间】:2017-09-29 07:05:19
【问题描述】:

有时当我尝试将 tableview 滚动到一行时,我会意外地提供一个不存在的节/行。然后应用就会崩溃。

self.tableView.scrollToRow(at: IndexPath(row: targetRow, section: targetSection), at: UITableViewScrollPosition.bottom, animated: true);

我怎样才能使这个滚动过程不崩溃?我的意思是,如果我确实提供了一个不存在的部分/行,我希望 UITableView 忽略它。或者如何在滚动之前检查 UITableView 中是否存在节/行?谢谢。

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    使用此 UITableView 扩展来检查 Indexpath 是否有效。

    extension UITableView
    {
        func indexPathExists(indexPath:IndexPath) -> Bool {
            if indexPath.section >= self.numberOfSections {
                return false
            }
            if indexPath.row >= self.numberOfRows(inSection: indexPath.section) {
                return false
            }
            return true
        }
    }
    

    这样使用

    var targetRowIndexPath = IndexPath(row: 0, section: 0)
    if table.indexPathExists(indexPath: targetRowIndexPath)
    {
      table.scrollToRow(at: targetRowIndexPath, at: .bottom, animated: true)
    }
    

    【讨论】:

    • 这是另一个将其作为扩展的好主意。谢谢!
    • 重新审视这个问题后,我认为这个答案实际上更好,因此我重新选择了我接受的这个答案。
    【解决方案2】:

    试试这个 --

    let indexPath = IndexPath(row: targetRow, section: targetSection)
    if let _ = self.tableView.cellForRow(at: indexPath) {
     self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true)
    }
    

    【讨论】:

    • 太聪明了!我忘记了 cellForRow 函数。谢谢!
    • 我认为使用“守卫”会是更好的选择,因为它特别用于避免崩溃? like guard let _ = self.tableView.cellForRow(at: indexPath) else { return }
    • @Bharath 这取决于我们在哪里使用它。没有像这样的后卫是崩溃的更好选择。就像只有在条件中找到 nil 时才从那里返回一样。但是如果 let 只是检查条件是否为 nil,那么 line 的剩余代码也将执行。你可以检查这个link also
    • 警告:如果单元格不可见,cellForRow 将为零。
    • @AdityaSrivastava 如果您需要滚动到超出可见范围的某个单元格,这对您没有帮助。
    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多