Ячейки представления коллекции дублируются при прокрутке - PullRequest
1 голос
/ 20 сентября 2019

У меня есть представление коллекции, и у меня есть собственный класс для ячеек.Каждая ячейка содержит текстовое представление, вот код:

class CustomWriterPageCell: UICollectionViewCell, UITextViewDelegate {

    fileprivate let textViewOne: UITextView = {

        let tv = UITextView()
        tv.backgroundColor = .cyan
        tv.text = "Chapter Title"
        tv.font = UIFont(name: "Avenir-Roman", size: 27)
        tv.textColor = .gray
        return tv

    }()
}

Вот это cellForItemAt:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "WriterPageCellID", for: indexPath) as! CustomWriterPageCell
    cell.backgroundColor = .clear

    return cell
}

Текстовое представление имеет заполнитель, которого я достиг черезследующий код (это внутри пользовательского класса ячеек):

func textViewDidBeginEditing(_ textView: UITextView) {

    if textView.textColor == .gray {

        textView.text = nil
        textView.textColor = .black
    }
}

func textViewDidEndEditing(_ textView: UITextView) {

    if textView.text.isEmpty {
        textView.textColor = .gray
        textView.text = "Chapter Title"
    }
}

Проблема в том, что, что бы я ни вводил в текстовом представлении первой ячейки, появляется в 4-й ячейке, я знаю, что это происходитиз-за dequeueReusableCell но я не могу решить эту проблему, ни одно из решений подобных проблем не помогло мне, надеюсь, кто-то может мне помочь, спасибо!:)

Ответы [ 3 ]

2 голосов
/ 20 сентября 2019

Проблема в том, что вы не указываете, какой текст должен отображаться в каждом из textView вашего CollectionViewCell.Пока вы не укажете то же самое в cellForItemAt indexPath, будет отображаться повторно использованная ячейка и ее содержимое, начиная с dequeueReusableCell, как вы сказали.

Для решения вашей конкретной проблемы вы можете сделатькак показано ниже в контроллере вида:

`var textViewContentArray = [Int: String]()` //Create a dictionary to hold the texts globally

В textViewDidEndEditing :

func textViewDidEndEditing(_ textView: UITextView) {
    if textView.text.isEmpty {
        textView.textColor = .gray
        textView.text = "Chapter Title"
    } else {
        guard let cell = textView.superview?.superview as? CustomWriterPageCell else {
            return
        }
        guard  let indexPath = self.collectionView.indexPath(for: cell) else { return }
        textViewContentArray[indexPath.row] = textView.text
    }
}

В textViewDidBeginEditing :

func textViewDidBeginEditing(_ textView: UITextView) {
    textView.textColor = .black
}

И в cellForItemAt indexPath :

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomWriterPageCell", for: indexPath) as! CustomWriterPageCell
    cell.textView.delegate = self
    let text = textViewContentArray[indexPath.row]
    if !text.isEmpty {
        cell.textView.textColor = .black
        cell.textView.text = text
    } else {
        cell.textView.textColor = .gray
        cell.textView.text = "Chapter Title"
    }
    return cell
}

Примечание : вот яПредполагая, что вы установили Controller, который хранит collectionView в качестве делегата для textViewInCell, если ячейка является делегатом, вы можете обновить textViewContentArray, используя протокол

Надеюсь, что это добавляет вашего понимания.

0 голосов
/ 21 сентября 2019

Я полагаю, что часть, которую вы хотите изменить, инкапсулирована в модель, такую ​​как textColor, text, которую вы упомянули.Не изменяйте отображение интерфейса вручную, я имею в виду, изменив модель, а затем обновив интерфейс, чтобы не было повторений.

Это правило для всех таблиц, измените модель для обновления интерфейсаНадеюсь быть вам полезной.

0 голосов
/ 20 сентября 2019

Я предполагаю, что 4-я ячейка не помещается в текущем представлении (то есть доступна ниже при прокрутке, т.е. повторно используемая ячейка)

1) Если вы повторно используете ячейку, вам необходимо убедиться, что перед тем, как ячейка выйдет изДля просмотра необходимо сохранить UITextView данные где-нибудь.В противном случае он потеряет данные (т.е. текст, написанный) из-за повторного использования.Сохраните данные для каждой ячейки в структуре данных / любой форме.

2) Если вы прокрутите до 4-й ячейки, проверьте, существуют ли данные.Если нет, тогда установите пустое состояние для просмотра текста.Если вы что-то напишете, то сохраните данные для 4-й ячейки в структуре данных / любой форме .. (Вы можете использовать это textViewDidEndEditing() для сохранения текущих данных)

3) Снова прокрутите назад до 1-го типа ячейки, чтобы сохранитьданные структуры данных 1-й ячейки / любой формы для этого индекса.

4) Теперь вернитесь к 4-й ячейке.Во время повторного использования установите сохраненные данные 4-й ячейки для просмотра текста ячейки.

Data Saved at Index == Cell Index

Убедитесь, что вы правильно используете ваш вариант использования.В реализации повторного использования нет ничего плохого.Убедитесь, что вы сохранили данные и правильно их сбросили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...