swift:如何在单击按钮上对所有单元格进行 TTS

Posted

技术标签:

【中文标题】swift:如何在单击按钮上对所有单元格进行 TTS【英文标题】:swift: how to TTS all cell on click button 【发布时间】:2018-02-06 10:03:57 【问题描述】:

我在多个单元格的 UITableViewCell 中有一个 UITextView: 在单击 UIButton 时,需要所有单元格 textView 的文本才能将表单文本转换为语音(TTS)。 UIButton 在 UITableViewCell 中。 现在,单击按钮时,所有单元格的 textview 文本都不会从文本转换为语音。只有一个 textView 的文本在按钮单击时被转换

UITableViewCell

class HomeTableViewCell: UITableViewCell 

  var homeViewCon: HomeTableViewController?
  let synth = AVSpeechSynthesizer()

  @IBAction func ttsBtnClick(_ sender: Any) 

    guard let ttsBtnCheck = sender as? UIButton else 
        return
    

    if ttsBtnCheck.isSelected 
        ttsBtn.setImage(UIImage(named: "tts"), for: .normal)
        ttsBtnCheck.isSelected = false
        synth.stopSpeaking(at: AVSpeechBoundary.immediate)
     else
        print("ttsBtnClick false ")
        ttsBtn.setImage(UIImage(named: "ttsBlue"), for: .selected)
        ttsBtnCheck.isSelected = true

        textToSpeech()

        let point = (sender as AnyObject).convert(CGPoint.zero, to: self.homeViewCon?.homeTableView)
        let indexPath = self.homeViewCon?.homeTableView.indexPathForRow(at: point)!

        let indexPathRow  = indexPath?.row ?? 0
        let indexPathSection = self.homeViewCon?.homeTableView.numberOfRows(inSection: (indexPath?.section)!)

        if indexPathRow < indexPathSection! 
            let newIndexPath = NSIndexPath(row:(indexPath?.row)! + 1, section:(indexPath?.section)!)
            self.homeViewCon?.homeTableView.scrollToRow(
                at: newIndexPath as IndexPath, at:.bottom, animated: true)
        
    




func textToSpeech()


    let name: String = newsTextView.text
    let endIndex = name.index(name.endIndex, offsetBy: -3)
    let truncated = name.substring(to: endIndex)



    let index2 = truncated.range(of: ".", options: .backwards)?.lowerBound

    var substring3 = index2.map(truncated.substring(to:))


    let utterance = AVSpeechUtterance(string: titleLabel.text!+". "+substring3!)

    utterance.voice = AVSpeechSynthesisVoice(language: "en-US")


    synth.speak(utterance)



【问题讨论】:

你有什么问题? @ReinierMelian 我想在点击 UIButton 后 tts 所有单元格 所有单元格ssssss不仅相关单元格按钮???? @Sh_Khan 你在写。我现在要做什么 在表格视图中显示时,您已经有了所需的文本。只需循环包含文本的数组并为该文本执行 TTS,不要在单击按钮时从特定文本视图中获取文本。使用数组获取 TTS 的所有文本 【参考方案1】:

请与故事板 UI 一起找到可行的解决方案。

斯威夫特 4

    //
    //  TableViewVC.swift
    //
    //  Created by Test User on 06/02/18.
    //  Copyright © 2018. All rights reserved.
    //

    import UIKit
    import AVFoundation

    class customCell: UITableViewCell 

        @IBOutlet weak var lblTTS: UILabel!
        @IBOutlet weak var btnTTS: UIButton!

        override func awakeFromNib() 
            super.awakeFromNib()
        

        override func setSelected(_ selected: Bool, animated: Bool) 
            super.setSelected(selected, animated: animated)
        
    

    class TableViewVC: UIViewController 

        @IBOutlet weak var tblTTS: UITableView!


        var arrTTS = [
            "This is first text",
            "This is second text",
            "This is third text",
            "This is fourth text",
            "This is fifth text",
            "This is sixth text",
            "This is seventh text",
            "This is eighth text",
            "This is ninth text",
            "This is tenth text",
            "This is eleventh text",
            "This is twelfth text",
        ]

        let speechSynthesizer                       = AVSpeechSynthesizer()
        var previousSelectedIndexPath              : IndexPath?


        override func viewDidLoad() 
            super.viewDidLoad()
            speechSynthesizer.delegate = self
        

        override func didReceiveMemoryWarning() 
            super.didReceiveMemoryWarning()
        

        @IBAction func btnTTSClicked(sender: UIButton) 

            let point = sender.convert(CGPoint.zero, to: self.tblTTS)
            let indexPath = self.tblTTS.indexPathForRow(at: point)

            if previousSelectedIndexPath == indexPath 

                let cell = self.tblTTS.cellForRow(at: indexPath!) as! customCell
                speechSynthesizer.stopSpeaking(at: .immediate)
                cell.btnTTS.setTitle("TTS", for: .normal)
                previousSelectedIndexPath = nil

             else 

                if previousSelectedIndexPath == nil 

                    previousSelectedIndexPath = indexPath

                    let cell = self.tblTTS.cellForRow(at: indexPath!) as! customCell
                    cell.btnTTS.setTitle("Speaking", for: .normal)

                    if speechSynthesizer.isSpeaking 

                        speechSynthesizer.stopSpeaking(at: .immediate)

                     else 

                        let speechUtterance = AVSpeechUtterance(string: self.arrTTS[indexPath!.row])

                        DispatchQueue.main.async 
                            self.speechSynthesizer.speak(speechUtterance)
                        
                    

                 else 

                    let oldCell = self.tblTTS.cellForRow(at: previousSelectedIndexPath!) as! customCell
                    oldCell.btnTTS.setTitle("TTS", for: .normal)

                    let cell = self.tblTTS.cellForRow(at: indexPath!) as! customCell
                    cell.btnTTS.setTitle("Speaking", for: .normal)

                    previousSelectedIndexPath = indexPath

                    if speechSynthesizer.isSpeaking 

                        speechSynthesizer.stopSpeaking(at: .immediate)

                     else 

                        let speechUtterance = AVSpeechUtterance(string: self.arrTTS[indexPath!.row])

                        DispatchQueue.main.async 
                            self.speechSynthesizer.speak(speechUtterance)
                        
                    

                
            
        
    

    extension TableViewVC: UITableViewDataSource, UITableViewDelegate 

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
            return arrTTS.count
        

        //----------------------------------------------------------------

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

            let cell = tableView.dequeueReusableCell(withIdentifier: "customCell") as! customCell

            cell.lblTTS.text = self.arrTTS[indexPath.row]
            cell.btnTTS.addTarget(self, action: #selector(btnTTSClicked(sender:)), for: .touchUpInside)

            return cell
        

        //----------------------------------------------------------------

        func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
            return 50
        
    

    extension TableViewVC: AVSpeechSynthesizerDelegate 

        func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) 

            speechSynthesizer.stopSpeaking(at: .word)

            if previousSelectedIndexPath != nil 
                let speechUtterance = AVSpeechUtterance(string: self.arrTTS[previousSelectedIndexPath!.row])
                DispatchQueue.main.async 
                    self.speechSynthesizer.speak(speechUtterance)
                
            
        
    

【讨论】:

嘿@Minzu 你觉得我的回答有帮助吗? tts 在使用您的代码后只是第一行重复 您能详细说明一下的意思吗? 我有一个无限滚动的 tableView。我想在单击按钮上执行 tts 所有单元格值。单击按钮后,它将自动滚动并自动 tts 所有单元格值。 根据我当前的实现,我在所有单元格中添加了 TTS 按钮,无论您点击哪个单元格 TTS 按钮,它的文本都将转换为语音,并且该语音将播放。【参考方案2】:

问题是,当您单击其中一个单元格上的按钮时,并非所有单元格都是可见的,因此当用户在 textView 中输入文本并滚动时,文本会丢失,因此请实现 didEndDisplaying 以将当前 textView 的文本存储在一个全局数组,当单击单元格按钮时,循环遍历数组内容并对每个文本执行 tts

optional func tableView(_ tableView: UITableView,didEndDisplaying cell: UITableViewCell,forRowAt indexPath: IndexPath)

【讨论】:

我要在这部小说中写什么请帮帮我 访问单元格 tectView 文本并将其存储在全局数组的相关索引中,当用户滚动时将保存您的文本 我想在点击按钮后自动滚动 点击UIButton后底部会自动滚动和tts textviews 单元格的内容是预先设置在 cellforrow 中的?

以上是关于swift:如何在单击按钮上对所有单元格进行 TTS的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中的 UITableViewCell 上添加带有单击事件的按钮?

Swift - 想要在单击集合视图单元格内的按钮时进行更改

单击Swift 4中的自定义按钮时调整单元格大小

Swift - 表格视图单元格内的单击按钮不会在该单元格的功能处调用确实选择行

Swift 3.0 TableView 单元格按钮

在集合视图单元格 Swift 中管理多个进度视图