Swift3を使ってデータベースと連携したTableViewのコードについて質問です。
データベースからTableViewに貼り付けたスイッチの動作について質問です。
カスタムセルを使い、データベースの内容を表示する事、データを追加、削除はできました。
問題はセルに配置したスイッチを切り替えた時にBool値のデータを切り替えたいのですが
上手くいきません。インターネットでやり方を検索して実装したのですがイマイチ自信がありません。
今出ているエラーメッセージは
**unrecognized selector sent to instance **
というものです。
そもそも、実装に関するロジックなのですが、
テーブルビューのスイッチが押されたという事をどこで判別するかという点ですが
InputViewControllerのスイッチが押されたアクションで取得なのかな?と考えました。
カスタムセルとInput用のビューコレクターのコードは以下になります。
InputViewController
1 2import UIKit 3import RealmSwift 4 5class InputViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{ 6 7 //OUTLET 8 @IBOutlet weak var pareText: UITextField! 9 @IBOutlet weak var tableView: UITableView! 10 11 //デフォルトのRealmインスタンスを取得する 12 let realm = try! Realm() 13 14 //DB内のデータを保持する配列(IDの順番でソート) 15 let dataArray = try! Realm().objects(Pare.self).sorted(byProperty: "id", ascending: true) 16 17 //データを追加するアクション 18 @IBAction func appPare(_ sender: UIButton) { 19 20 //入力チェック 21 if isValidateInputContents() == false{ 22 print("入力値に問題あり") 23 return 24 } 25 26 //登録するデータを作成 27 let pare = Pare() 28 pare.name = pareText.text! 29 pare.isUse = true 30 if(dataArray.count != 0){ 31 pare.id = dataArray.max(ofProperty: "id")! + 1 32 } 33 34 //Realmに書き込み 35 do { 36 try realm.write { 37 realm.add(pare, update: true) 38 } 39 } catch { 40 print("データ登録失敗") 41 } 42 tableView.reloadData() 43 } 44 45 override func viewDidLoad() { 46 super.viewDidLoad() 47 } 48 49 override func didReceiveMemoryWarning() { 50 super.didReceiveMemoryWarning() 51 } 52 53 // MARK: UITableViewDataSource プロトコルのメソッド 54 //各セクションのセル数を返す 55 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 56 return dataArray.count 57 } 58 59 //各セルの内容を返す 60 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 61 //再利用可能なCellを得る 62 //let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "Cell") 63 let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! CustomTableViewCell 64 65 //Cellに値を設定する 66 let object = dataArray[indexPath.row] 67 cell.setCell(idLabelText: "\(object.id)", tpareLabelText: object.name, swIsUseValue: object.isUse) 68 return cell 69 } 70 71 //セルが選択された時に呼ばれるデリゲートメソッド 72 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 73 print("セル番号:\(indexPath.row) セルの内容:\(dataArray[indexPath.row])") 74 } 75 76 //セルの削除 77 //セルが削除可能なことを伝える 78 func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 79 return UITableViewCellEditingStyle.delete; 80 } 81 82 //Deleteボタンが押された時データベース削除の処理 83 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 84 if editingStyle == UITableViewCellEditingStyle.delete { 85 try! realm.write { 86 self.realm.delete(self.dataArray[indexPath.row]) 87 tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.fade) 88 } 89 } 90 } 91 92 //カスタムセルのスイッチが押された時の処理 93 @IBAction func isUseSwitch(_ sender: UISwitch) { 94 let point = self.tableView.convert(sender.frame.origin, from: sender.superview) 95 if let indexPath = self.tableView.indexPathForRow(at: point) { 96 print("section: \(indexPath.section) - row: \(indexPath.row)") 97 } 98 } 99 100 //データベースの値をチェック 101 private func isValidateInputContents()->Bool{ 102 //名前の入力 103 if let name = pareText.text { 104 if name.characters.count == 0{ 105 return false 106 } 107 }else{ 108 return false 109 } 110 return true 111 } 112} 113
CustomTableViewCellでBool値の物にボタンを割り当ててます
CustomTableViewCell.swift
1import UIKit 2 3class CustomTableViewCell: UITableViewCell { 4 ///OUTLET 5 @IBOutlet weak var idLabel: UILabel! 6 @IBOutlet weak var pareLabel: UILabel! 7 @IBOutlet weak var swIsUse: UISwitch! 8 9 override func awakeFromNib() { 10 super.awakeFromNib() 11 // Initialization code 12 } 13 14 override func setSelected(_ selected: Bool, animated: Bool) { 15 super.setSelected(selected, animated: animated) 16 } 17 18 //セルを設定するメソッド 19 func setCell(idLabelText: String, tpareLabelText: String, swIsUseValue: Bool) { 20 idLabel.text = idLabelText 21 pareLabel.text = tpareLabelText 22 swIsUse.isOn = swIsUseValue 23 } 24}
少し分かりにくい質問になりましたが、実装方法について
解決方法を知りたいと思ってます。
<補足します>
テスト中の画像を載せます
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/21 23:14
2016/10/21 23:38
2016/10/22 14:45