Создание textView в ячейке collectionView firstResponder при навигации по ячейкам - PullRequest
0 голосов
/ 05 июня 2018

У меня есть collectionView и я могу динамически добавлять ячейки в collectionView.Контроллер представления показывает только одну ячейку за раз, и я хочу, чтобы первый textView (который является частью ячейки) стал firstResponder (и всегда оставлял клавиатуру видимой), которая прекрасно работает при загрузке контроллера представления (такжекак в одном из случаев ниже).

Я создал метод для обнаружения текущей ячейки, который я вызываю каждый раз в любом из этих случаев: (1) пользователь прокручивает из одной ячейки в другую (метод помещенв scrollViewWillEndDragging), (2) пользователь нажимает кнопки UIB для перехода от одной ячейки к другой, (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).Очевидно, у меня нет ячейки типа AddCardCell в случаях (2) и (3).Когда я печатаю 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 голосов
/ 05 июня 2018

Что касается случая 2,3, я думаю, что ячейка еще не загружена, поэтому if let не удается, вы можете попытаться отправить это через некоторое время, как это также, общее замечание, если ячейка не видна, то это ноль

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

Также это может работать, если вы установите animated:false на scrollToItem

...