我有一个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()
}
答案 0 :(得分:0)
关于案例2,3,我认为单元格尚未加载,因此if let
失败,你可以尝试在这样的一段时间之后发送它,一般说明如果单元格不可见那么它是零< / p>
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
setNewFirstResponder()
}
如果将animated:false
设置为scrollToItem