前提・実現したいこと
Swift言語で音選択画面を作成しています。
過去に同様の画面で質問させていただきましたが、
今回は、すでにセットされていてその画面から音を変更しようと遷移した際の
チェックマークの外し方についてお力を貸していただきたいです。
セル選択時イベントですでにチェックがついているセルのチェックを外す処理を入れていましたが、
効いてくれません(cell.accessoryTypeが[.none])。
下記の流れでの問題を解消したいです。
1.変数「sSelSound」にセットした状態で遷移してくる
2.セットした対象の音にはチェックマークがついている
3.別の音を選択する
4.上記2でチェックがついていたセルもチェックがついたままになってしまう
語彙力がなく伝わりづらいかもしれませんが、お力を貸してください。
該当のソースコード
swift
1import UIKit 2 3class SettingViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 } 8 9 override func viewWillAppear(_ animated: Bool) { 10 let iWidthScreen:CGFloat = self.view.frame.size.width 11 let iHeightScreen:CGFloat = self.view.frame.size.height 12 13 let btnSelectArarm = UIButton() 14 btnSelectArarm.frame = CGRect(x: iWidthScreen * 0.4, y: iHeightScreen * 0.535, width: iWidthScreen * 0.55, height: 30) 15 btnSelectArarm.setTitle("音選択") 16 btnSelectArarm.addTarget(self, action: #selector(selectAlarmSound), for: .touchUpInside) 17 self.view.addSubview(btnSelectArarm) 18 } 19 20 override func didReceiveMemoryWarning() { 21 super.didReceiveMemoryWarning() 22 } 23 24 // アラーム選択ボタン押下 25 @objc func selectAlarmSound(sender: UIButton) { 26 let soundView = SelectSoundViewController() 27 soundView.sSelSound = "機関車" 28 self.present(soundView, animated: true, completion: nil) 29 } 30}
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 let navItem:UINavigationItem = UINavigationItem(title: “サウンド選択”) 32 navItem.leftBarButtonItem = UIBarButtonItem(title: "<戻る", style: .plain, target: nil, action: #selector(self.goBack)) 33 navItem.leftBarButtonItem?.tintColor = UIColor.white 34 nav.pushItem(navItem, animated: true) 35 self.view.addSubview(nav) 36 37 let tableView = UITableView() 38 tableView.frame = CGRect(x: 0, y: iHeightScreen * 0.15, width: iWidthScreen, height: iHeightScreen * 0.85) 39 tableView.delegate = self 40 tableView.dataSource = self 41 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 42 self.view.addSubview(tableView) 43 } 44 45 // セルの個数を設定 46 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 47 return aSounds.count 48 } 49 50 // セルに値をセット 51 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 52 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 53 cell.textLabel!.text = aSounds[indexPath.row] 54 cell.selectionStyle = .none 55 if (sSelSound != nil && sSelSound == aSounds[indexPath.row]) { 56 // ここで前画面での選択音にチェックをつけています 57 cell.accessoryType = .checkmark 58 } else { 59 cell.accessoryType = .none 60 } 61 return cell 62 } 63 64 // セルが選択された時 65 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 66 let selectCell = tableView.cellForRow(at: indexPath) 67 // チェックマークをつける 68 selectCell?.accessoryType = .checkmark 69 // [TODO:ここで外すことができない]遷移時に付いているチェックマークを外す 70 if (sSelSound != nil && sSelSound != "" && sSelSound != aSounds[indexPath.row]) { 71 let iOldSelSound = aSounds.index(of: sSelSound) 72 let oldSelSound = tableView.cellForRow(at: IndexPath(row: iOldSelSound!, section: 0)) 73 oldSelSound!.accessoryType = .none 74 } 75 76 sSelSound = aSounds[indexPath.row] 77 sSoundFile = aFileName[indexPath.row] 78 do { 79 let sound:SystemSoundID = SystemSoundID(aAlarm[indexPath.row]) 80 AudioServicesPlaySystemSound(sound) 81 } 82 } 83 84 // セルの選択が外れた時 85 func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 86 let didSelCell = tableView.cellForRow(at: indexPath) 87 didSelCell?.accessoryType = .none 88 } 89}
補足情報(FW/ツールのバージョンなど)
MacOS HighSieera
Xcode 10.1
Swift 3.0
回答1件
あなたの回答
tips
プレビュー