如何检查IndexPath是否有效?

时间:2017-04-25 15:14:48

标签: ios swift swift3 nsindexpath indexpath

在swift 3之前,我曾经使用过例如:

let path = self.tableView.indexPathForSelectedRow
if (path != NSNotFound) {
//do something
 }

但是现在,因为我在swift3中使用IndexPath类,所以我正在寻找path != NSNotFound检查的等价物。

Xcode8.3.1编译错误: "二元运算符'!='不能应用于类型' IndexPath'的操作数。和' Int'"

4 个答案:

答案 0 :(得分:9)

从语义上讲,要考虑indexPath invalid ,您需要检查一些内容,例如表视图或集合视图。

如果 indexPath 表示数据源中没有相应数据的行,通常可以认为 indexPath 无效。 (一个例外是"加载更多"行。)

如果您确实需要创建无效的IndexPath,则可以执行以下操作:

let invalidIndexPath = IndexPath(row: NSNotFound, section: NSNotFound)

更新后:

self.tableView.indexPathForSelectedRow会返回一个可选项,如果没有选定的行,则可以nil

if let path = tableView.indexPathForSelectedRow {
  // There is a selected row, so path is not nil.
}
else {
  // No row is selected.
}

无论如何,将pathNSNotFound进行比较会在所有情况下都会引发异常。

答案 1 :(得分:5)

要检查IndexPath是否存在,我使用此扩展功能:

import UIKit

extension UITableView {

    func hasRowAtIndexPath(indexPath: NSIndexPath) -> Bool {
        return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
    }
}

要使用它我会做这样的事情:

if tableView.hasRowAtIndexPath(indexPath: indexPath as NSIndexPath) {
    // do something
}

答案 2 :(得分:0)

通过@pableiros 改进答案以处理部分或行小于 0 的边缘情况。当表为空并且您尝试通过 listOfSectionHeaders.count - 1listOfRowsForSection.count - 1 访问它时会发生这种情况

extension UITableView {
    func isValid(indexPath: IndexPath) -> Bool {
        return indexPath.section >= 0 && indexPath.section < self.numberOfSections && indexPath.row >= 0 && indexPath.row < self.numberOfRows(inSection: indexPath.section)
    }
}

答案 3 :(得分:0)

我偶然发现 collectionView(_:didEndDisplaying:forItemAt:) 返回无效 indexPath 的情况,因此我使用 indexPath.isEmpty 检查 indexPath 是否确实是行/节 indexPath。