前提・実現したいこと
サウンド選択画面を作成しています。
そこで選択したサウンドにチェックを付与しいているのですが、
上下スクロールした際に、別のサウンドにもチェックマークが付与されてしまいます。
スクロールした際に[func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell]が呼ばれることはわかったのですが、バグ修正までたどり着けません。
スクロールのトリガーによって呼ばれたのかタップ選択によって呼ばれたのか判別ができれば
制御できそうな気もしなくはないのですが、その際にも戻り値は「UITableViewCell」のため、
どうすべきなのか・・・色々と悩んでおります。
・やりたいことは、スクロールした際に選択したサウンド以外にチェックがつかないようにしたいです。
伝わりづらいかもしれませんが、お力を貸してください。
該当のソースコード
swift
1import AudioToolbox 2import AVFoundation 3import UIKit 4 5class SelectSoundViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 6 7 var player: AVAudioPlayer! 8 9 var sSelSound: String! 10 11 // サウンドリスト 12 var aSounds:Array<String> = ["鐘", "トライトーン", "チャイム", "ガラス", "ホーン", "ベル", "エレクトリック", "予感", "ブルーム", "カリプソ", "機関車", "ファンファーレ", "メヌエット", "ニュースフラッシュ", "ノアール", "シャーウッドの森", "スペル", "サスペンス", "アップデート"] 13 var aAlarm:Array<Int> = [1000, 1002, 1008, 1009, 1010, 1013, 1014, 1015, 1020, 1021, 1022, 1023, 1025, 1027, 1028, 1029, 1030, 1031, 1032, 1036] 14 var aFileName:Array<String> = ["new-mail.caf", "mail-sent.caf", "sms-received2.caf", "sms-received3.caf", "sms-received4.caf", "sms-received5.caf", "sms-received6.caf", "Anticipate.caf", "Bloom.caf", "Calypso.caf", "Choo_Choo.caf", "Fanfare.caf", "Minuet.caf", "News_Flash.caf", "Noir.caf", "Sherwood_Forest.caf", "Spell.caf", "Suspense.caf", "Update.caf"] 15 16 var iCnt = 0 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 21 self.view.backgroundColor = UIColor.black 22 23 // 画面のサイズを取得する 24 let iWidthScreen = self.view.frame.width 25 let iHeightScreen = self.view.frame.height 26 27 // タイトル 28 let nav = UINavigationBar() 29 nav.frame = CGRect(x: 0, y: 45, width: self.view.frame.width, height: 50) 30 nav.barTintColor = UIColor.gray 31 nav.titleTextAttributes = [ 32 .foregroundColor: UIColor.white 33 ] 34 let navItem:UINavigationItem = UINavigationItem(title: “サウンド選択”) 35 navItem.leftBarButtonItem = UIBarButtonItem(title: "<戻る", style: .plain, target: nil, action: #selector(self.goBack)) 36 navItem.leftBarButtonItem?.tintColor = UIColor.white 37 nav.pushItem(navItem, animated: true) 38 self.view.addSubview(nav) 39 40 let tableView = UITableView() 41 tableView.frame = CGRect(x: 0, y: iHeightScreen * 0.15, width: iWidthScreen, height: iHeightScreen * 0.85) 42 tableView.delegate = self 43 tableView.dataSource = self 44 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 45 self.view.addSubview(tableView) 46 } 47 48 // セルの個数を設定 49 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 50 return aSounds.count 51 } 52 53 // セルに値をセット 54 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 // セルを取得 56 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 57 // セルに値をセット 58 cell.textLabel!.text = aSounds[indexPath.row] 59 // 選択されていたセルの背景色を変更 60 cell.selectionStyle = .none 61 // アラーム音がすでに選択されている場合チェックをつける 62 if (sSelSound != nil && sSelSound == aSounds[indexPath.row]) { 63 cell.accessoryType = .checkmark 64 } 65 return cell 66 } 67 68 // セルが選択された時 69 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 70 let selectCell = tableView.cellForRow(at: indexPath) 71 // チェックマークをつける 72 selectCell?.accessoryType = .checkmark 73 // 遷移時に付いているチェックマークを外す 74 if (sSelSound != nil && sSelSound != "" && sSelSound != aSounds[indexPath.row]) { 75 let iOldSelSound = aSounds.index(of: sSelSound) 76 let oldSelSound = tableView.cellForRow(at: IndexPath(row: iOldSelSound!, section: 0)) 77 oldSelSound!.accessoryType = .none 78 } 79 80 // 選択サウンドをセット 81 sSelSound = aSounds[indexPath.row] 82 sSoundFile = aFileName[indexPath.row] 83 // サウンドを流す 84 do { 85 let sound:SystemSoundID = SystemSoundID(aAlarm[indexPath.row]) 86 AudioServicesPlaySystemSound(sound) 87 } 88 } 89 90 // セルの選択が外れた時 91 func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 92 let didSelCell = tableView.cellForRow(at: indexPath) 93 // チェックマークを外す 94 didSelCell?.accessoryType = .none 95 } 96} 97
試したこと
過去の質問(https://teratail.com/questions/56853)にありました
ページを拝見しましたが、解決策が見つかりませんでした。
補足情報(FW/ツールのバージョンなど)
MacOS HighSieera
Xcode 10.1
swift 3.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/18 04:08
2020/05/18 04:18