创建通用函数以从 table 和集合视图获取索引路径 - iOS - Swift
Create generic function to get indexpath from table and collection view - iOS - Swift
我有一个 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
}
}
但实际上,您不应该 在 table 视图单元格上需要 getIndexPath
方法。单元格不应知道它们的索引路径。我建议你重新考虑你的设计。
我有一个 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
}
}
但实际上,您不应该 在 table 视图单元格上需要 getIndexPath
方法。单元格不应知道它们的索引路径。我建议你重新考虑你的设计。