一次从所有集合视图单元格内的文本视图中获取文本

Posted

技术标签:

【中文标题】一次从所有集合视图单元格内的文本视图中获取文本【英文标题】:Getting text from text views inside all collection view cells at once 【发布时间】:2019-09-19 07:11:30 【问题描述】:

我有一个集合视图,我正在为单元格使用自定义类。每个单元格是主视图的高度和宽度,每个单元格都有一个文本视图,代码如下:

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
    


是否可以一次打印所有单元格中的所有文本?

【问题讨论】:

你能出示你的cellforItem吗 【参考方案1】:

我记得你的previous question。对我之前的答案稍作改动将对您有所帮助。在您之前的问题中,您将CustomWriterPageCell 设置为UITextView 的代表。取而代之的是,这次将您的 Controller 设置为委托。

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 传输到您的控制器。 现在这里的问题是你不知道这个文本属于哪个indexPath。

我并不是说这是最好的解决方案,但在您的情况下它可以安全地工作: 您可以为每个 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.


你可以在你的 Controller 中这样声明它: var texts = Array(repeating: "", count: 10) 其中 10 是集合视图中的项目数。

一切都设置好了,让我们进入您的打印按钮:

 @objc func printButtonTapped() 

       for text in self.texts 

            print(text)

       


【讨论】:

嘿,非常感谢您的回答,它的工作,但现在的问题是,我在上一个问题中想要的停止工作,有什么办法可以让两者都工作? 是的,我可以让两者都工作;)我会在完成我的工作后编辑我的答案。 嘿,我想通了,谢谢你。你这个人!另外,如果您不介意我问,您是如何学习 swift 的?课程还是??? 不客气。很高兴你做到了。我从观看 Mark Price Udemy 的视频开始。他们很棒。 您好,您知道如何解决单元格重复问题吗?这是因为 dequeuReuseableCell 而发生的,但我似乎无法弄清楚【参考方案2】:

如果您已经设置了数据源并且您的单元格上显示了所有文本的数组,那么您可以通过访问数据本身来一次打印所有文本,如下所示:-



class ViewController: UIViewController 

   fileprivate var texts = [String]()

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




【讨论】:

嘿,我没有数组设置,你能告诉我怎么做吗,对不起,我不擅长 swift【参考方案3】:

你需要创建一个模型,例如

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

那么你还需要一个数组来管理你的控制器中的模型

class ViewController: UIViewController 

    var yourModels = [YourModel]()

数组 yourModels 将用于显示到您的 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)
        
    

【讨论】:

嘿,我说的是集合视图而不是表视图 集合视图的方式相同,您只需要一个数组来管理您的模型。然后你可以对这些模型做任何事情(例如:打印出这个案例的值) 这一行的替换是什么,这给出了一个错误:cell.config(byYourModel: self.yourModels[indexPath.row]) 你遇到了什么错误?请注意,您可以根据自己的风格使用不同的类、函数名,我的只是示例。 “CustomWriterPageCell”类型的值没有成员“config”

以上是关于一次从所有集合视图单元格内的文本视图中获取文本的主要内容,如果未能解决你的问题,请参考以下文章

如何从表格视图的自定义单元格内的文本字段中获取值(标签)以发布到 URL [重复]

在表格视图中的所有单元格都已加载后,重新加载表格视图单元格内的集合视图

如何从位于集合视图单元格内的步进器中获取选定的 IndexPath?

在动态表格视图中获取文本字段值

表视图单元格内的集合视图

如何在swift ios中调整集合视图单元格的高度?