我有一个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中还不能获得cell,但我在案例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()
}
发布于 2018-06-06 04:43:37
对于情况2,3我认为单元格还没有加载,所以if let
失败,你可以尝试在一段时间后像这样调度它,另外一般注意如果单元格不可见,那么它是空的
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
setNewFirstResponder()
}
此外,如果将animated:false
设置为scrollToItem
,它也可以工作
https://stackoverflow.com/questions/50708575
复制相似问题