在给定 indexPath 之后生成所有 indexPaths 的数组

Posted

技术标签:

【中文标题】在给定 indexPath 之后生成所有 indexPaths 的数组【英文标题】:Generate array of all indexPaths after given indexPath 【发布时间】:2017-07-12 11:21:21 【问题描述】:

我正在写一个UICollectionViewLayout 子类。

我知道集合视图有多少个部分...numberOfSections

我知道每个部分有多少项目...numberOfItems[section]

给定一个起始 indexPath IndexPath(item: x, section: y) 我需要创建一个包含此起始 indexPath 之后的所有 indexPaths 的数组。

我尝试过类似...

// iterate all sections
let indexPaths: [IndexPath] = (initialIndexPath.section..<numberOfSections).flatMap  section in
    // find initial item in section
    let initialItemIndex = section == initialIndexPath.section ? initialIndexPath.item + 1 : 0

    // iterate all items in section
    return (initialItemIndex..<(numberOfItems[section] ?? 0)).flatMap  item in
        return IndexPath(item: item, section: section)
    

但这告诉我(在第二个平面地图上)......

“flatMap”产生“[SegmentOfResult.Iterator.Element]”,而不是预期的上下文结果类型“IndexPath?”

我在布局的另一部分使用了类似的东西,但不太清楚为什么它在这里不起作用。

有更好的方法吗?

【问题讨论】:

【参考方案1】:

好的,经过一番折腾后,我确定这取决于 Swift 推断闭包类型的方式。

我通过将第一个闭包的类型从 section in 显式设置为 (section) -&gt; ([IndexPath]) 来修复它

// iterate all sections
let indexPaths: [IndexPath] = (initialIndexPath.section..<numberOfSections).flatMap  (section) -> ([IndexPath]) in
    // find initial item in section
    let initialItemIndex = section == initialIndexPath.section ? initialIndexPath.item + 1 : 0

    // iterate all items in section
    return (initialItemIndex..<(numberOfItems[section] ?? 0)).flatMap  item in
        return IndexPath(item: item, section: section)
    

【讨论】:

是的,有 2 个“flatMap”候选者,并且仅针对“单语句闭包”自动推断闭包类型。 – 请注意,内部 flatMap 可以只是一个地图。 – 为什么numberOfItems[section] 是可选的? @MartinR 它现在只是可选的,因为我使用字典来存储它。我最终会改变它。 :)

以上是关于在给定 indexPath 之后生成所有 indexPaths 的数组的主要内容,如果未能解决你的问题,请参考以下文章

当 UICollectionView 最初加载其数据时,我们如何获得可见的 Cell IndexPath

Swift:使用 sectionNameKeyPath 的单元格的 indexPath

给定 UITableViewCell 的 indexPath,加载该特定单元格

如何滚动到给定的 indexPath.item?

在 heightForRowAt IndexPath 之后 UITableViewCell 的层没有得到更新

删除项目后使用 nil indexPath 调用 tableView:cellForRowAtIndexPath