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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

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回答

1059閲覧

[Swift/iOS]画面上下スクロールでのバグを修正したい(チェックマークのバグ)

entaro12345

総合スコア75

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

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/05/18 02:00

前提・実現したいこと

サウンド選択画面を作成しています。
そこで選択したサウンドにチェックを付与しいているのですが、
上下スクロールした際に、別のサウンドにもチェックマークが付与されてしまいます。
スクロールした際に[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

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1// アラーム音がすでに選択されている場合チェックをつける 2if (sSelSound != nil && sSelSound == aSounds[indexPath.row]) { 3 cell.accessoryType = .checkmark 4} else { 5 cell.accessoryType = .none 6}

CellForRowAtしか見てないけど、これで試してみて

投稿2020/05/18 02:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

entaro12345

2020/05/18 04:08

ご回答ありがとうございます。 いただいた実装で試して見たところ、スクロールでのバグは解消されました! ただ、別の問題かもしれませんが、 サウンド選択⇨画面遷移⇨スクロール⇨別のサウンド選択 上記の流れを操作した際に、 「let oldSelSound = tableView.cellForRow(at: IndexPath(row: iOldSelSound!, section: 0))」 で、取得できなくなってしまいました。 恐れ入りますが、こちらについてわかりますでしょうか?
entaro12345

2020/05/18 04:18

失礼いたしました。 単純なバグでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問