【问题标题】:selectItem not selecting cells if they are near to current selected cell如果它们靠近当前选定的单元格,则 selectItem 不选择单元格
【发布时间】:2018-05-24 12:53:14
【问题描述】:

我目前正在开发一个 UIViewController,顶部有一个水平 collectionView,接下来几个月的星期几(如日历),在它下面我有一个 tableView,下一个事件发生在用户位置附近. 当用户向下滚动表格视图时,它会获取顶部单元格事件日期并将 collectionView 滚动到那一天。我正在使用以下代码:

在 tableView 的 cellForRowAt 上:

datePicker.selectItem(at: selectedIndexPath, animated: true, scrollPosition:UICollectionViewScrollPosition.centeredHorizontally)

在 collectionView 的 cellForItemAt 上:

if cell.isSelected {

            cell.selectedCircle.layer.cornerRadius = 15
            cell.selectedCircle.backgroundColor = UIColor(red:1, green:0.08, blue:0.35, alpha:1)
            cell.weekDayLabel.alpha = 1
            selectedMonth.text = dateToday.3.firstUppercased


        } else {

            cell.selectedCircle.backgroundColor = UIColor(red:1, green:0.08, blue:0.35, alpha:0)
            cell.weekDayLabel.alpha = 0.4
        }

当下一个要选择的 collectionView IndexPath 与前一个相距甚远时,一切都可以正常工作。当它们相距大约 8 或低于 indexPaths 时,collectionView 滚动到正确的 indexPath 但不运行 isSelected 代码。

有什么想法吗?感谢您的时间。

【问题讨论】:

    标签: ios swift uicollectionview


    【解决方案1】:

    看起来您正在单元格内存储 isSelected 信息。不。您可能会得到一个以前在其他地方并被回收的细胞。将选择哪些单元格的逻辑保留在其他东西(如数组)中,并根据索引路径查找。

    【讨论】:

    • 感谢您的帮助,欧文。我想我明白你在说什么,只是不太清楚该怎么做。所以tableView cell 保留了.selectItem 函数,然后将collectionView 目标cell indexpath 存储在一个数组中。我已经覆盖了,只是不知道从那里去哪里。你能给我一个帮助吗?谢谢。
    • 将选定的单元格存储在集合视图之外,在您自己的私有数组或其他结构中。这些单元格被重复使用,或者您将创建一个新单元格。当你在 cellForItemAt: 方法中被调用时,在你的数组中查找是否应该选择单元格。
    【解决方案2】:

    我遇到了类似的问题。我有一个带有水平滚动和分页的 UICollectionView。

    只要我没有在不是下一页上的前 2 个单元格或上一页的最后 2 个单元格之一的单元格上调用 selectItem(at:animated:scrollPosition:),一切都很好。

    问题似乎是 isSelected 没有被设置。并且 cellForItem(at:) 也没有被调用(我认为是因为单元实际上已经加载了)。

    这是我的解决方案。我将 UICollectionView 子类化并覆盖 contentOffset 以在单元格可能变为可见时收到通知,然后手动设置 isSelected。

    override var contentOffset: CGPoint {
        didSet {
            self.refreshVisibleCells()
        }
    }
    
    func refreshVisibleCells() {
        for cell in self.visibleCells {
            let cell = cell as! CalendarViewCell
            if cell.date == self.selectedDate {
                cell.isSelected = true
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多