具有水平分页的UICollectionView单元格UI随机消失

时间:2018-06-06 08:45:53

标签: ios swift uicollectionview uitextview cell

我有一个UICollectionView,它一次显示一个单元格,在启用分页的情况下水平滚动。每个单元格都有一些UI(视图,textViews)。

我有三种方式可以让用户浏览单元格。 (1)用户点击UIButtons使用collectionView.scrollToItem从一个单元格向左/右导航,(2)用户通过点击另一个UIButton在数组末尾创建一个新单元格,(3)用户使用scrollViewWillEndDragging滚动。

问题是,在情况(1)和(2)中,小区UI偶尔会消失。从一个小区到另一个小区来回导航会再次将其带回来。这似乎是随机的。

我有两种方法可以隔离问题,但仍然无法找到修复方法:(a)如果我在每个导航之间完全将所有textViews设置为endEditing(true),则UI不会消失(这意味着键盘完全消失后再重新出现)。 (b)如果用户仅使用滚动方法在单元格之间导航,它永远不会消失 - 只要使用任何按钮,UI就会再次消失。

我尝试使用prepareForReuse()方法重置自定义UICollectionView单元格中的UI,但这似乎没有帮助。

这可能与我之前提到的another question有关。

感谢您的任何指示!!

这就是我将我的细胞出列的方式:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let addCardCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCell", for: indexPath) as! AddCardCell

    addCardCell.autoSaveCard = autoSaveCards[indexPath.item]
    return addCardCell
}

这是我的滚动方法:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    autoSaveCard()

    let x = targetContentOffset.pointee.x
    currentCardIndex = Int(x / view.frame.width)
    updateKeyboardInputLabelsAndButtons()

    setNewFirstResponder()
}

其中一个按钮方法:

@objc func handleAddCell() {
    autoSaveCard()
    createEmptyAutoSaveCard()

    let newIndexPath = IndexPath(item: autoSaveCards.count - 1, section: 0)
    collectionView.insertItems(at: [newIndexPath])

    collectionView.scrollToItem(at: newIndexPath, at: .left, animated: false)
    currentCardIndex = autoSaveCards.count - 1

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        self.setNewFirstResponder()
    }
}

1 个答案:

答案 0 :(得分:0)

试试这个。保留一个数组,用于存储您在控制器中创建的单元格(例如cellsArray)。然后,如果元素存在于indexPath.row

,则从此数组返回
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if cellsArray[indexPath.row] != nil {
        return cellsArray[indexPath.row]
    }

    let addCardCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCell", for: indexPath) as! AddCardCell

    addCardCell.autoSaveCard = autoSaveCards[indexPath.item]
    cellsArray.append(addCardCell)
    return addCardCell
}