func convertPointToIndexPath(_ point: CGPoint) -> (UITableView, IndexPath)? {
if let tableView = [tableView1, tableView2, tableView3].filter({ $0.frame.contains(point) }).first {
let localPoint = scrollView.convert(point, to: tableView)
let lastRowIndex = focus?.0 === tableView ? tableView.numberOfRows(inSection: 0) - 1 : tableView.numberOfRows(inSection: 0)
let indexPath = tableView.indexPathForRow(at: localPoint) ?? IndexPath(row: lastRowIndex, section: 0)
return (tableView, indexPath)
}
return nil
}
所以我得到了这个方法,它将CGPoint转换为给定uitableView的indexPath。我在包含uitableViews的数组上使用filter-Method。
我在这个方法之外有一个包含任意数量的uitableViews的数组。例如:
public var littleKanbanColumnsAsTableViews: [UITableView] = []
所以我必须在方法内部进行更改。像这样:
if let tableView = littleKanbanColumnsAsTableViews.filter({ $0.frame.contains(point)}).first { ... }
现在,当我点击gui上的任何tableView时,我会跟踪该点的坐标,并使用frame.contains(point)方法将其转换为所属的tableview。
我的问题是过滤器无法正常工作,无论点击哪个tableview,它总是会给我第一个tableView。为什么它不适用于我的littleKanbanColumnsAsTableViews-Array?
一个暗示:
let tableView = littleKanbanView.littleKanbanColumnsAsTableViews[3]
当我将其直接索引时,它可以正常工作。但我希望它取决于哪个tableView包含点击的点。
这是我的数组与tableViews,在这种情况下,数组包含5个tableviews。
现在我想从它们中过滤tableView,其中包括点击此tableView的点。我怎样才能做到这一点?
为了更多的理解,我添加了ui,就是这样:
当我点击这个tableView它可以工作,因为它是我的tableViews数组中的第一个元素。因此,对于这种情况,convertPointToIndexPath-Method正在工作。
但是当我水平滚动到第二个tableView并且点击它时,它不起作用。因为我认为该方法总是让我回到第一个元素,但我认为它用给定的条件过滤它。
问题是什么,为什么不能处理条件{ $0.frame.contains(point)}
?当跟踪点的坐标时,它必须本地化tableView。
答案 0 :(得分:0)
在这种情况下,当满足第一个满足条件时,不会遍历其余元素。
if let tableView = littleKanbanColumnsAsTableViews.first(where: { $0.frame.contains(point) }) {
}
在这种情况下,遍历数组中的所有元素以构建满足条件的表视图数组。然后选择该过滤数组的第一个元素。
if let tableView = (littleKanbanColumnsAsTableViews.filter{ $0.frame.contains(point)}).first {
}