У меня есть представление коллекции, и я использую собственный класс для ячеек. Каждая ячейка имеет два текстовых представления: ChapterTitleTextView и ChapterBodyTextView. Я добавил заполнители в оба текстовых представления следующим образом:
class CustomWriterPageCell: UICollectionViewCell, UITextViewDelegate {
// When the user taps on a text view
func textViewDidBeginEditing(_ textView: UITextView) {
if textView.textColor == .gray {
textView.text = nil
textView.textColor = .black
}
}
// When the user taps out of a text view or taps on the done button in the toolbar
func textViewDidEndEditing(_ textView: UITextView) {
// If the chapter title text view is empty
if chapterTitleTextView.text.isEmpty {
chapterTitleTextView.text = "Chapter Title"
chapterTitleTextView.textColor = .gray
}
// If the chapter body text view is empty
if chapterBodyTextView.text.isEmpty {
chapterBodyTextView.text = "Chapter Body"
chapterBodyTextView.textColor = .gray
}
}
}
Как это работает, цвет текста изначально серый и есть некоторый текст, когда пользователь нажимает на текстовое представление, цвет меняется на черный, а текст в текстовом представлении удаляется.
Теперь есть эта проблема с использованием dequeueReusableCell, это то, что он повторно использует ячейки, это вызвало проблему номер 1: все, что я печатаю в текстовом представлении в первой ячейке, отображается в 4-й ячейке, чтобы решить эту проблему, мне пришлось создать 2 глобальных списка чтобы хранить все, что я печатаю, и это отображается в текстовых представлениях ячеек, вот код:
Глобальные списки:
var chapterTitleText = Array(repeating: "", count: 4) // To store the chapter title text
var chapterBodyText = Array(repeating: "", count: 4) // To store the chapter body text
Следующий фрагмент кода находится внутри textViewDidEndEditing из предыдущего
// Append the chapter body text to the chapterBodyText array
let titleText = chapterTitleTextView.text
let titleRow = textView.tag //This the indexPath.row
chapterTitleText[titleRow] = titleText!
// Append the chapter title text to the chapterTitleText array
let bodyText = chapterBodyTextView.text
let bodyRow = textView.tag
chapterBodyText[bodyRow] = bodyText!
И в ячейкеForItemAt:
cell.chapterBodyTextView.tag = indexPath.row
cell.chapterTitleTextView.tag = indexPath.row
cell.chapterTitleTextView.text = chapterTitleText[indexPath.row]
cell.chapterBodyTextView.text = chapterBodyText[indexPath.row]
Это избавило от проблемы №1 (текст в текстовом виде дублируется). Но потом у меня возникла новая проблема, помните текст-заполнитель, о котором я говорил? Когда я что-то набираю в одном из текстовых представлений первой ячейки, цвет текста текстового представления в четвертой ячейке меняется. Я добавлю GIF, воспроизводящий проблему, чтобы помочь читателям понять: