やりたいこと
下の写真のようにカスタムセルにボタンを配置し,そのボタンをタップするとタップしたボタンのタイトルを変更したい.
現在のコード
CustomTableViewCell.swift
Swift
1import UIKit 2 3class CustomTableViewCell: UITableViewCell { 4 5 //"A面"or"B面" 6 @IBOutlet weak var button: UIButton! 7 8 override func awakeFromNib() { 9 super.awakeFromNib() 10 } 11 12 override func setSelected(_ selected: Bool, animated: Bool) { 13 super.setSelected(selected, animated: animated) 14 } 15}
ViewController.swift
Swift
1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 //tableViewのインスタンス 6 @IBOutlet weak var tableView: UITableView! 7 //"A面"か"B面"か判断するためのフラグ 8 var array: [String] = [] 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 self.tableView.delegate = self 13 self.tableView.dataSource = self 14 //初期値は全てのセルが"A面" 15 self.array = Array(repeating: "A面", count: 50) 16 } 17 18 19 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 20 return self.array.count 21 } 22 23 24 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 25 guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? CustomTableViewCell else { 26 return UITableViewCell() 27 } 28 return cell 29 } 30 31 32 @IBAction func tapButton(_ sender: UIButton) { 33 //タップされたボタンのあるセルを取得 34 let cell = sender.superview?.superview as! CustomTableViewCell 35 //タップされたボタンのあるセルの位置を取得 36 guard let row = self.tableView.indexPath(for: cell)?.row else { 37 print("Error") 38 return 39 } 40 switch self.array[row] { 41 case "A面": 42 //タップされたボタンが"A面"であればフラグを"B面"にする 43 self.array[row] = "B面" 44 DispatchQueue.main.async { 45 //タイトルの変更 46 cell.button.setTitle("B面", for: .normal) 47 } 48 default: 49 //タップされたボタンが"B面"であればフラグを"A面"にする 50 self.array[row] = "A面" 51 DispatchQueue.main.async { 52 //タイトルの変更 53 cell.button.setTitle("A面", for: .normal) 54 } 55 } 56 } 57}
問題点
上記のコードでは選択したボタン以外のボタンのタイトルも変更されてしまいます.
多分セルの再利用の観点から問題が生じているのかと思いますが,解決策がわかりません.
具体的にコードで修正していただける方,よろしくお願いいたします.
環境
xcode : ver11.3.1
swift : ver5.1.3
ios : 13.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。