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 上添加带有单击事件的按钮?