在导航单元格时,使collectionView单元格中的textView成为firstResponder

时间:2018-06-05 20:38:35

标签: ios swift cell collectionview

我有一个collectionView,允许用户动态地将单元格添加到collectionView。视图控制器一次只显示一个单元格,我希望第一个textView(它是单元格的一部分)成为firstResponder(并始终保持键盘可见),这在加载视图控制器时也能正常工作(以及如下面的一个案例中那样。)

我创建了一个检测当前单元格的方法,我在以下任何一种情况下都会调用它:(1)用户从一个单元格滚动到另一个单元格(放置在scrollViewWillEndDragging中的方法),(2)用户点击UIButtons进行导航从一个单元格到另一个单元格,(3)用户点击UIButton在数组末尾创建并附加一个新单元格(由collectionView使用)。

这是方法:

func setNewFirstResponder() {
    let currentIndex = IndexPath(item: currentCardIndex, section: 0)
    if let newCell = collectionView.cellForItem(at: currentIndex) as? AddCardCell {
        newCell.questionTextView.becomeFirstResponder()
    }
}

现在我的问题是这只适用于案例(1)。显然在案例(2)和(3)中我没有AddCardCell类型的单元格。当我打印currentCardIndex时,在所有情况下都得到相同的结果,这非常令人困惑。

任何暗示为什么在案例2和案例3中我无法获得单元格,但我遇到案例1?

作为参考,我在使用的是一些方法:

//Update index and labels based on user swiping through card cells
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    //Update index based on targetContentOffset
    let x = targetContentOffset.pointee.x
    currentCardIndex = Int(x / view.frame.width)

    setNewFirstResponder()
}

另一种方法,它不起作用(案例3):

//Method to add a new cell at end of collectionView
@objc func handleAddCell() {
    //Inserting a new index path into tableView
    let newIndexPath = IndexPath(item: autoSaveCards.count - 1, section: 0)
    collectionView.insertItems(at: [newIndexPath])

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

    setNewFirstResponder()
}

1 个答案:

答案 0 :(得分:0)

关于案例2,3,我认为单元格尚未加载,因此if let失败,你可以尝试在这样的一段时间之后发送它,一般说明如果单元格不可见那么它是零< / p>

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

如果将animated:false设置为scrollToItem

,它也可以正常工作