在导航单元格时,使集合中的文本视图单元格成为第一响应者



我有一个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类型的单元格。当我打印当前CardIndex时,在所有情况下我都会得到相同的结果,这非常令人困惑。

任何提示为什么我在案例 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()
}

关于情况 2,3,我认为单元格尚未加载,因此if let失败,您可以尝试在这样的一段时间后调度它,还要注意如果单元格不可见,则为零

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

如果您将animated:false设置为scrollToItem,它也可以工作

最新更新