Пользовательский интерфейс ячейки UICollectionView со случайным исчезновением горизонтальной подкачки - PullRequest
0 голосов
/ 06 июня 2018

У меня есть UICollectionView, который показывает одну ячейку за раз, прокручивается горизонтально с включенной подкачкой страниц.Каждая ячейка имеет некоторый пользовательский интерфейс (views, textViews).

У меня есть три способа навигации по ячейкам.(1) Пользователь нажимает кнопки UIB для перемещения влево / вправо от ячейки к ячейке с использованием collectionView.scrollToItem, (2) пользователь создает новую ячейку в конце массива, нажимая другую UIButton, (3) пользовательские прокрутки с использованием scrollViewWillEndDragging.

Проблема в том, что в случаях (1) и (2) иногда пользовательский интерфейс ячейки исчезает.Перемещение туда и обратно от одной ячейки к другой вернет ее снова.Это кажется случайным.

Есть два способа, как я смог изолировать проблему, но все еще не знаю, как найти исправление: (a) Интерфейс не исчезает, если я полностью установил все textViewsдо endEditing (true) между каждой навигацией (что означает, что клавиатура полностью исчезает перед повторным появлением).(b) он никогда не исчезает, если пользователь использует метод прокрутки только для перехода от ячейки к ячейке - как только любая из кнопок будет использована, пользовательский интерфейс снова исчезнет.

Я попытался сбросить пользовательский интерфейсв пользовательской ячейке UICollectionView с помощью метода prepareForReuse (), но это, похоже, не помогло.

Возможно, это связано с другим вопросом Я задавал ранее.

Спасибо за любые указатели !!

Вот как я снимаю свою клетку:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let addCardCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCell", for: indexPath) as! AddCardCell

    addCardCell.autoSaveCard = autoSaveCards[indexPath.item]
    return addCardCell
}

Вот мой метод прокрутки:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    autoSaveCard()

    let x = targetContentOffset.pointee.x
    currentCardIndex = Int(x / view.frame.width)
    updateKeyboardInputLabelsAndButtons()

    setNewFirstResponder()
}

Один из методов кнопки:

@objc func handleAddCell() {
    autoSaveCard()
    createEmptyAutoSaveCard()

    let newIndexPath = IndexPath(item: autoSaveCards.count - 1, section: 0)
    collectionView.insertItems(at: [newIndexPath])

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

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

1 Ответ

0 голосов
/ 07 июня 2018

Попробуй это.Сохраните массив для хранения ячеек, которые вы создаете в контроллере (скажем, cellsArray).Затем вернитесь из этого массива, если элемент существует в этом indexPath.row.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if cellsArray[indexPath.row] != nil {
        return cellsArray[indexPath.row]
    }

    let addCardCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCell", for: indexPath) as! AddCardCell

    addCardCell.autoSaveCard = autoSaveCards[indexPath.item]
    cellsArray.append(addCardCell)
    return addCardCell
}
...