前提・実現したいこと
[単語または文章を入力し、それらを読み上げる機能]
tableViewのセルの番号とそれらに紐付けたボタンtagの番号を揃えたい
発生している問題・エラーメッセージ
下記のコードでは、セルに配置されたボタンがどのセル番号のボタンなのかどうかはbuttonのtagを用いて判定しています。 セルの並び替えを行うとセルの内容は更新するようにできましたが、tag番号は変わらないため、選択した単語と読み上げる単語に齟齬が生まれてしまいます。 初心者なので分かりませんが、 let item = words[sourceIndexPath.row] words.remove(at: sourceIndexPath.row) words.insert(item, at: destinationIndexPath.row) のように順番を一気に差し替えるような方法があったりするのでしょうか。 ご教授いただければ幸いです。よろしくお願いします。
該当のソースコード
swift
1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 @IBOutlet weak var tableView: UITableView! 7 8 var speak:AVSpeechSynthesizer = AVSpeechSynthesizer() 9 var words = [String]() 10 var cellNumber = 0 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 tableView.rowHeight = UITableView.automaticDimension 15 self.tableView.tableFooterView = UIView() 16 17 navigationItem.leftBarButtonItem = editButtonItem 18 let addButton = UIBarButtonItem(barButtonSystemItem: .add, 19 target: self, 20 action:#selector(onAddTapped(_:))) 21 navigationItem.rightBarButtonItem = addButton 22 23 tableView.delegate = self 24 tableView.dataSource = self 25 } 26 //セルを追加 27 func add(_ word: String){ 28 let index = 0 29 words.insert(word, at: index) 30 let indexPath = IndexPath(row: index, section: 0) 31 tableView.insertRows(at: [indexPath], with: .right) 32 } 33 34 @objc 35 func onAddTapped(_ sender: Any) { 36 37 let alert = UIAlertController(title: "Edit Name", message: "Enter Chinese",preferredStyle: .alert) 38 alert.addTextField {(ChineseTH) in 39 ChineseTH.placeholder = "words" 40 } 41 42 let OkAction = UIAlertAction(title: "Add", style: UIAlertAction.Style.default) { (_) in 43 guard let word = alert.textFields?.first?.text else { return } 44 self.add(word) 45 print("OK") 46 } 47 alert.addAction(OkAction) 48 present(alert, animated: true, completion: nil) 49 50 } 51 52 //セルTap時 53 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 54 tableView.deselectRow(at: indexPath, animated: true) 55 } 56 //挿入セルの内容 57 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->UITableViewCell { 58 59 let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier:"none") 60 let word = words[indexPath.row] 61 62 cell.textLabel?.text = word 63 cell.textLabel?.numberOfLines=0 64 65 if let transform = word.applyingTransform(.mandarinToLatin, reverse: false) { 66 cell.detailTextLabel?.text = transform 67 cell.detailTextLabel?.numberOfLines=0 68 } 69 70 //UIButton 71 let speakButton = UIButton(type: .system) 72 speakButton.addTarget(self, action: #selector(buttonTapped(_:)), for: UIControl.Event.touchUpInside) 73 speakButton.setImage(#imageLiteral(resourceName: "audio"), for: .normal) 74 speakButton.frame = CGRect(x:0, y:0, width:30, height:30) 75 speakButton.tag = indexPath.row + cellNumber 76 cellNumber = cellNumber + 1 77 cell.accessoryView = speakButton 78 79 return cell 80 } 81 82 @objc func buttonTapped(_ sender: UIButton) { 83 let content = AVSpeechUtterance(string: words[words.count - 1 - sender.tag]) 84 content.voice = AVSpeechSynthesisVoice(language: "zh-CN") 85 self.speak.speak(content) 86 } 87 88 //編集モード 89 override func setEditing(_ editing: Bool, animated: Bool) { 90 super.setEditing(editing, animated: animated) 91 tableView.setEditing(editing, animated: animated) 92 } 93 94 //順序入れ替え 95 func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 96 return true 97 } 98 99 func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { 100 101 let item = words[sourceIndexPath.row] 102 words.remove(at: sourceIndexPath.row) 103 words.insert(item, at: destinationIndexPath.row) 104 } 105 106 //スワイプで削除するか 107 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 108 if editingStyle == .delete { 109 words.remove(at: indexPath.row) 110 tableView.deleteRows(at: [indexPath], with: .right) 111 } else if editingStyle == .insert {} 112 } 113 114 override func didReceiveMemoryWarning() { 115 super.didReceiveMemoryWarning() 116 } 117 118 func numberOfSections(in tableView: UITableView) -> Int { 119 return 1 120 } 121 122 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 123 return words.count 124 } 125 126} 127 128 129
補足情報(FW/ツールのバージョンなど)
xcode11.1
回答3件
あなたの回答
tips
プレビュー