我有一个tableView和collectionView,为了获得indexPath,我在tableViewCell和collectionViewCell上使用以下方法(我不想使用indexPathForSelectedRow/Item方法(。有没有一种方法可以让它变得通用?
想法请
// For Tableview
func getIndexPath() -> IndexPath? {
guard let superView = self.superview as? UITableView else {
return nil
}
let indexPath = superView.indexPath(for: self)
return indexPath
}
// For CollectionView
func getIndexPath() -> IndexPath? {
guard let superView = self.superview as? UICollectionView else {
return nil
}
let indexPath = superView.indexPath(for: self)
return indexPath
}
您可以使用两个协议来实现这一点,一个是UITableView
和UICollectionView
都符合,另一个则是UITableViewCell
和UICollectionViewCell
都符合。
protocol IndexPathQueryable: UIView {
associatedtype CellType
func indexPath(for cell: CellType) -> IndexPath?
}
protocol IndexPathGettable: UIView {
associatedtype ParentViewType: IndexPathQueryable
}
extension UITableView : IndexPathQueryable { }
extension UICollectionView : IndexPathQueryable { }
extension UICollectionViewCell : IndexPathGettable {
typealias ParentViewType = UICollectionView
}
extension UITableViewCell : IndexPathGettable {
typealias ParentViewType = UITableView
}
extension IndexPathGettable where ParentViewType.CellType == Self {
func getIndexPath() -> IndexPath? {
guard let superView = self.superview as? ParentViewType else {
return nil
}
let indexPath = superView.indexPath(for: self)
return indexPath
}
}
实际上,不应该需要表视图单元格上的getIndexPath
方法。单元格不应该知道它们的索引路径。我建议你重新考虑你的设计。