包含uitableviews

时间:2017-05-11 23:15:08

标签: ios swift uitableview

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。

array containing tableviews

现在我想从它们中过滤tableView,其中包括点击此tableView的点。我怎样才能做到这一点?

为了更多的理解,我添加了ui,就是这样:

UI of my app

当我点击这个tableView它可以工作,因为它是我的tableViews数组中的第一个元素。因此,对于这种情况,convertPointToIndexPath-Method正在工作。

但是当我水平滚动到第二个tableView并且点击它时,它不起作用。因为我认为该方法总是让我回到第一个元素,但我认为它用给定的条件过滤它。

问题是什么,为什么不能处理条件{ $0.frame.contains(point)}?当跟踪点的坐标时,它必须本地化tableView。

1 个答案:

答案 0 :(得分:0)

首选解决方案:

在这种情况下,当满足第一个满足条件时,不会遍历其余元素。

if let tableView = littleKanbanColumnsAsTableViews.first(where: { $0.frame.contains(point) }) {

}

效率不高的解决方案:

在这种情况下,遍历数组中的所有元素以构建满足条件的表视图数组。然后选择该过滤数组的第一个元素。

if let tableView = (littleKanbanColumnsAsTableViews.filter{ $0.frame.contains(point)}).first {

}