質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

780閲覧

[Swift/iOS]音選択画面で遷移時につけたチェックを別の音選択時に外したい

entaro12345

総合スコア75

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/07/16 01:29

編集2020/07/16 08:39

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/07/16 07:58

実際に実行してみましたが、何が問題になっているのかよく理解できませんでした。 「遷移」というのは「違うセルを選択する」ということでしょうか。 現状のプログラムでは 1, 起動するとシステムサウンドの一覧が表示される 2. なにかひとつ選択すると、右側にチェックマークが付き、システムサウンドが再生される 3. 次に別のセルを選択すると、以前のチェックマークは消え、新たに選択されたシステムサウンドが選択状態になり、音も再生される となっていますが、このどの部分がどのように想定と違うのでしょうか。
TsukubaDepot

2020/07/16 07:59

ちなみに、「遷移(トランジッション、transition)」というのは違う viewController などを表示させる(performSegueやnavigatonControllerなどの操作など)を指すことが多いようです。
entaro12345

2020/07/16 08:17

投稿ありがとうございます。 わかりづらくて申し訳ございません。 前の画面からすでに選択済みの場合は、変数「sSelSound」に対してセットしてから上記の画面へ遷移します。 下記の流れでの問題を解消したいです。 1.変数「sSelSound」にセットした状態で遷移してくる 2.セットした対象の音にはチェックマークがついている 3.別の音を選択する 4.上記2でチェックがついていたセルもチェックがついたままになってしまう
TsukubaDepot

2020/07/16 08:21 編集

では、前画面のコードもご質問本文に追記していただけないでしょうか。 また、上記コメントに書いていただいた問題点(1-4)も本文に追記していただければとおもいます(追記修正の依頼は目立たないため)。
entaro12345

2020/07/16 08:31

失礼しました。 はい、追記いたします。
guest

回答1

0

ベストアンサー

いただいたコードで問題なく動いています。

遷移前

イメージ説明

遷移後

「機関車」が選択されている

イメージ説明

別の音を選択

「機関車」からチェックマークが外れている

イメージ説明

質問者さんの環境(Xcode 10.1/Swift 3.0)と私の環境(Xcode11.6/Swift5.1)は違うため、一部コードの変更は行なっていますが、そこが根本的な問題とは考えにくいと思います。

投稿2020/07/16 09:09

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

entaro12345

2020/07/16 09:24

ご回答ありがとうございます。 別の原因も可能性があるとみてもう少し探ってみます! 動作確認までしていただき本当にありがとうございます。
entaro12345

2020/10/05 02:26

別の原因もなく問題ない動作をしていました。 違うソースコードで検証していたためNGとなっていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問