Получение текста из текстовых представлений внутри всех ячеек представления коллекции одновременно - PullRequest
0 голосов
/ 19 сентября 2019

Извините, если вопрос не ясен, я постараюсь объяснить это здесь, у меня есть представление коллекции, и я использую пользовательский класс для ячеек.Каждая ячейка имеет высоту и ширину основного вида, и каждая ячейка имеет текстовое представление, вот код:

class CustomWriterPageCell: UICollectionViewCell {

    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

    }()
}

У меня есть кнопка на моем контроллере представления, что я хочу сделатьв том, что когда я нажимаю на эту кнопку, я хочу, чтобы текст во всех моих ячейках был напечатан.Это возможно?Я сделал то, что мог, но он печатает только исходный текст («Заголовок главы»), который содержат текстовые представления, и печатает только текст видимой ячейки.Вот код:

class ViewController: UIViewController {

    @objc func printButtonTapped() {

        let cv = CustomWriterPageCell()
        print(cv.textViewOne.text)
        // Prints- Chapter Title 
    }
}

extension ViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowlayout {

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

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

        cell.backgroundColor = indexPath.item % 2 == 1 ? .green : .yellow

        return cell
    }

}

Можно ли распечатать весь текст сразу во всех ячейках?Надеюсь, кто-нибудь может мне помочь, спасибо!:)

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Я помню вас из вашего предыдущего вопроса .Небольшое изменение в моем предыдущем ответе поможет вам.В своем предыдущем вопросе вы указали CustomWriterPageCell в качестве делегата UITextView.Вместо этого, на этот раз, установите свой контроллер в качестве делегата.

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

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

    cell.backgroundColor = indexPath.item % 2 == 1 ? .green : .yellow
    cell.textViewOne.delegate = self

    return cell
}

Теперь, следуйте протоколу:

extension ViewController : UITextViewDelegate {
  func textViewDidEndEditing(_ textView: UITextView) {

      let text = textView.text 
  }

}

До сих пор выуспешно передал текст из TextView в ячейке на ваш контроллер.Теперь проблема в том, что вы не знаете, к какому из этих индексов относится этот индекс.

Я не говорю, что это лучшее решение, но в вашем случае оно работает безопасно: вы можете установить тег для каждогоTextView, который действует как id:

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

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

    cell.backgroundColor = indexPath.item % 2 == 1 ? .green : .yellow
    cell.textViewOne.delegate = self
    cell.textViewOne.tag = indexPath.row

    return cell

}

Затем:

extension ViewController : UITextViewDelegate {
   func textViewDidEndEditing(_ textView: UITextView) {
       let text = textView.text //This the text
       let row = textView.tag //This the indexPath.row
       self.texts[row] = text //Save texts in an array. This array is fixed-size and has number of elements equal to your number of collection view's Items.

}

Вы можете объявить это так в вашем контроллере: var texts = Array(repeating: "", count: 10), где 10 - этоколичество элементов в представлении коллекции.

Все настроено, перейдем к кнопке печати:

 @objc func printButtonTapped() {

       for text in self.texts {

            print(text)

       }

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

Вам нужно создать модель, например,

struct YourModel {
    var content = "" // Content is what's displayed in your cell
}

Затем вам также понадобится массив для управления вашими моделями в вашем контроллере.

class ViewController: UIViewController {

    var yourModels = [YourModel]()
}

Массив, для которого будут использоваться ваши модели.отобразить в вашем tableView.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? CustomWriterPageCell, self.yourModels.count > indexPath.row else {
            return UITableViewCell()
        }
        cell.config(byYourModel: self.yourModels[indexPath.row])
        return cell
}

Конфигурируйте свою ячейку

 class CustomWriterPageCell: UICollectionViewCell {

        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

        }()

        func config(byYourModel model: YourModel) {
            self.textView.text = model.content
        }
    }

А потом, если хотите напечатать все

class ViewController: UIViewController {

    @objc func printButtonTapped() {

        for model in self.yourModels {
            print(model.content)
        }
    }
}
0 голосов
/ 19 сентября 2019

Если вы уже настроили свой источник данных и у вас есть массив всех текстов, отображаемых в ваших ячейках, вы можете распечатать их все сразу, обратившись к самим данным, например: -



class ViewController: UIViewController {

   fileprivate var texts = [String]()

    @objc func printButtonTapped() {
       texts.forEach { (text) in
                      print(text)
                    }
    }
}



...