質問編集履歴

2 画像を追加

Robokun

Robokun score 36

2016/10/22 08:16  投稿

TableViewに貼り付けたスイッチのインデックスを取得する方法
Swift3を使ってデータベースと連携したTableViewのコードについて質問です。
データベースからTableViewに貼り付けたスイッチの動作について質問です。
カスタムセルを使い、データベースの内容を表示する事、データを追加、削除はできました。
問題はセルに配置したスイッチを切り替えた時にBool値のデータを切り替えたいのですが
上手くいきません。インターネットでやり方を検索して実装したのですがイマイチ自信がありません。
今出ているエラーメッセージは
**unrecognized selector sent to instance **
というものです。
そもそも、実装に関するロジックなのですが、
テーブルビューのスイッチが押されたという事をどこで判別するかという点ですが
InputViewControllerのスイッチが押されたアクションで取得なのかな?と考えました。
カスタムセルとInput用のビューコレクターのコードは以下になります。
```InputViewController
import UIKit
import RealmSwift
class InputViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{
   //OUTLET
   @IBOutlet weak var pareText: UITextField!
   @IBOutlet weak var tableView: UITableView!
   
   //デフォルトのRealmインスタンスを取得する
   let realm = try! Realm()
   //DB内のデータを保持する配列(IDの順番でソート)
   let dataArray = try! Realm().objects(Pare.self).sorted(byProperty: "id", ascending: true)
   
   //データを追加するアクション
   @IBAction func appPare(_ sender: UIButton) {
       //入力チェック
       if isValidateInputContents() == false{
           print("入力値に問題あり")
           return
       }
       
       //登録するデータを作成
       let pare = Pare()
       pare.name = pareText.text!
       pare.isUse = true
       if(dataArray.count != 0){
           pare.id = dataArray.max(ofProperty: "id")! + 1
       }
       
       //Realmに書き込み
       do {
           try realm.write {
               realm.add(pare, update: true)
           }
       } catch {
           print("データ登録失敗")
       }
       tableView.reloadData()
   }
   
   override func viewDidLoad() {
       super.viewDidLoad()
   }
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
   }
   
   // MARK: UITableViewDataSource プロトコルのメソッド
   //各セクションのセル数を返す
   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return dataArray.count
   }
   //各セルの内容を返す
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       //再利用可能なCellを得る
       //let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "Cell")
       let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! CustomTableViewCell
       //Cellに値を設定する
       let object = dataArray[indexPath.row]
       cell.setCell(idLabelText: "\(object.id)", tpareLabelText: object.name, swIsUseValue: object.isUse)
       return cell
   }
   
   //セルが選択された時に呼ばれるデリゲートメソッド
   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       print("セル番号:\(indexPath.row) セルの内容:\(dataArray[indexPath.row])")
   }
   
   //セルの削除
   //セルが削除可能なことを伝える
   func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
       return UITableViewCellEditingStyle.delete;
   }
   
   //Deleteボタンが押された時データベース削除の処理
   func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
       if editingStyle == UITableViewCellEditingStyle.delete {
           try! realm.write {
               self.realm.delete(self.dataArray[indexPath.row])
               tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.fade)
           }
       }
   }
   
   //カスタムセルのスイッチが押された時の処理
   @IBAction func isUseSwitch(_ sender: UISwitch) {
       let point = self.tableView.convert(sender.frame.origin, from: sender.superview)
       if let indexPath = self.tableView.indexPathForRow(at: point) {
           print("section: \(indexPath.section) - row: \(indexPath.row)")
       }
   }
   
   //データベースの値をチェック
   private func isValidateInputContents()->Bool{
       //名前の入力
       if let name = pareText.text {
           if name.characters.count == 0{
               return false
           }
       }else{
           return false
       }
       return true
   }
}
```
CustomTableViewCellでBool値の物にボタンを割り当ててます
```CustomTableViewCell.swift
import UIKit
class CustomTableViewCell: UITableViewCell {
   ///OUTLET
   @IBOutlet weak var idLabel: UILabel!
   @IBOutlet weak var pareLabel: UILabel!
   @IBOutlet weak var swIsUse: UISwitch!
   
   override func awakeFromNib() {
       super.awakeFromNib()
       // Initialization code
   }
   override func setSelected(_ selected: Bool, animated: Bool) {
       super.setSelected(selected, animated: animated)
   }
   
   //セルを設定するメソッド
   func setCell(idLabelText: String, tpareLabelText: String, swIsUseValue: Bool) {
       idLabel.text = idLabelText
       pareLabel.text = tpareLabelText
       swIsUse.isOn = swIsUseValue
   }
}
```
少し分かりにくい質問になりましたが、実装方法について
解決方法を知りたいと思ってます。
解決方法を知りたいと思ってます。
<補足します>
テスト中の画像を載せます
![イメージ説明](2ecc54031020d8dea3a6acd4c1519d5d.png)
  • iOS

    4955 questions

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

  • Swift

    9421 questions

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

1 誤字修正

Robokun

Robokun score 36

2016/10/22 03:26  投稿

TableViewに貼り付けたスイッチのインデックスを取得する方法
Swift3を使ってデータベースと連携したTableViewのコードについて質問です。
データベースからTableViewに貼り付けたスイッチの動作について質問です。
カスタムセルを使い、データベースの内容を表示する事、データを追加、削除はできました。
問題はセルに配置したスイッチを切り替えた時にBool値のデータを切り替えたいのですが
上手くいきません。インターネットでやり方を検索して実装したのですがイマイチ自信がありません。
今出ているエラーメッセージは
**unrecognized selector sent to instance **
というものです。
そもそも、実装に関するロジックなのですが、
テーブルビューのスイッチが押されたという事をどこで判別するかという点ですが
InputViewCollectionのスイッチが押されたアクションで取得なのかな?と考えました。
InputViewControllerのスイッチが押されたアクションで取得なのかな?と考えました。
カスタムセルとInput用のビューコレクターのコードは以下になります。
``` InputViewCollection
```InputViewController
import UIKit
import RealmSwift
class InputViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{
   //OUTLET
   @IBOutlet weak var pareText: UITextField!
   @IBOutlet weak var tableView: UITableView!
   
   //デフォルトのRealmインスタンスを取得する
   let realm = try! Realm()
   //DB内のデータを保持する配列(IDの順番でソート)
   let dataArray = try! Realm().objects(Pare.self).sorted(byProperty: "id", ascending: true)
   
   //データを追加するアクション
   @IBAction func appPare(_ sender: UIButton) {
       //入力チェック
       if isValidateInputContents() == false{
           print("入力値に問題あり")
           return
       }
       
       //登録するデータを作成
       let pare = Pare()
       pare.name = pareText.text!
       pare.isUse = true
       if(dataArray.count != 0){
           pare.id = dataArray.max(ofProperty: "id")! + 1
       }
       
       //Realmに書き込み
       do {
           try realm.write {
               realm.add(pare, update: true)
           }
       } catch {
           print("データ登録失敗")
       }
       tableView.reloadData()
   }
     
   
   override func viewDidLoad() {
       super.viewDidLoad()
   }
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
   }
   
   // MARK: UITableViewDataSource プロトコルのメソッド
   //各セクションのセル数を返す
   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return dataArray.count
   }
   //各セルの内容を返す
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       //再利用可能なCellを得る
       //let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "Cell")
       let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! CustomTableViewCell
       //Cellに値を設定する
       let object = dataArray[indexPath.row]
       cell.setCell(idLabelText: "\(object.id)", tpareLabelText: object.name, swIsUseValue: object.isUse)
       return cell
   }
   
   //セルが選択された時に呼ばれるデリゲートメソッド
   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       print("セル番号:\(indexPath.row) セルの内容:\(dataArray[indexPath.row])")
   }
   
   //セルの削除
   //セルが削除可能なことを伝える
   func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
       return UITableViewCellEditingStyle.delete;
   }
   
   //Deleteボタンが押された時データベース削除の処理
   func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
       if editingStyle == UITableViewCellEditingStyle.delete {
           try! realm.write {
               self.realm.delete(self.dataArray[indexPath.row])
               tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.fade)
           }
       }
   }
   
   //カスタムセルのスイッチが押された時の処理
   @IBAction func isUseSwitch(_ sender: UISwitch) {
       let point = self.tableView.convert(sender.frame.origin, from: sender.superview)
       if let indexPath = self.tableView.indexPathForRow(at: point) {
           print("section: \(indexPath.section) - row: \(indexPath.row)")
       }
   }
   
   //データベースの値をチェック
   private func isValidateInputContents()->Bool{
       //名前の入力
       if let name = pareText.text {
           if name.characters.count == 0{
               return false
           }
       }else{
           return false
       }
       return true
   }
}
```
CustomTableViewCell.swift
```lang-CustomTableViewCell.swift
CustomTableViewCellでBool値の物にボタンを割り当ててます
```CustomTableViewCell.swift
import UIKit
class CustomTableViewCell: UITableViewCell {
   ///OUTLET
   @IBOutlet weak var idLabel: UILabel!
   @IBOutlet weak var pareLabel: UILabel!
   @IBOutlet weak var swIsUse: UISwitch!
   
   override func awakeFromNib() {
       super.awakeFromNib()
       // Initialization code
   }
   override func setSelected(_ selected: Bool, animated: Bool) {
       super.setSelected(selected, animated: animated)
   }
   
   //セルを設定するメソッド
   func setCell(idLabelText: String, tpareLabelText: String, swIsUseValue: Bool) {
       idLabel.text = idLabelText
       pareLabel.text = tpareLabelText
       swIsUse.isOn = swIsUseValue
   }
}
```
少し分かりにくい質問になりましたが、実装方法について
解決方法を知りたいと思ってます。
  • iOS

    4955 questions

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

  • Swift

    9421 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る