在swift 3之前,我曾经使用过例如:
let path = self.tableView.indexPathForSelectedRow
if (path != NSNotFound) {
//do something
}
但是现在,因为我在swift3中使用IndexPath
类,所以我正在寻找path != NSNotFound
检查的等价物。
Xcode8.3.1编译错误: "二元运算符'!='不能应用于类型' IndexPath'的操作数。和' Int'"
答案 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.
}
无论如何,将path
与NSNotFound
进行比较会在所有情况下都会引发异常。
答案 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 - 1
、listOfRowsForSection.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。