複数のUITableViewCellから値を取得しデータベースへ保存する際に問題が発生
2日前にも質問しましたが、連続で躓いてしまいすいません。。
やりたいこと&状況
こういった構成で、 2,4で取得したデータをデータベースに保存する。
TableViewCellクラスは複数のセルをまとめて扱うクラスとして定義してある。
1のセル テキストラベルのみ
2のセル UIPickerView
3のセル テキストラベルのみ
4のセル UITextFieldと 編集終了ボタン
5のセル Realmデータベースに保存する
問題点
複数のセルから取得したデータを保存するように考えて設計していましたが、
セル2,セル4で取得したデータを処理しようと考えておりましたが、
このクラスで var categorySelected = "" , var textFieldInputed = ""で挿入されたデータを扱うことは出来ませんでした。
これはおそらく、TableViewのfunc cellForRowAtIndexPath でインスタンス化されたCustomTableViewCellのオブジェクトが個別に生成されているからだろうと思いました(おそらく)。
このように複数のカスタムされたセルから値を取得し、データベースに保存する(この場合RealmSwift)場合には、
どのように設計すべきだったのでしょうか。
もちろん、TableViewを使わずに同じことをするというのが現在やりたいことの解なのでしょうが、
TableViewCellを複数用いながらという前提なら、そのセルごとに保存させるか、モーダル表示させるなりして処理することが定石なのでしょうか?
それともこの状態からうまく処理する方法があるのでしょうか?
TableView
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
var cell:UITableViewCell = UITableViewCell()
switch indexPath.row{
case 0:
cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
case 1:
cell = tableView.dequeueReusableCellWithIdentifier("myPick", forIndexPath: indexPath) as! CustomAddTraining
case 2:
cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
case 3:
cell = tableView.dequeueReusableCellWithIdentifier("textField", forIndexPath: indexPath) as! CustomAddTraining
case 4:
cell = tableView.dequeueReusableCellWithIdentifier("done", forIndexPath: indexPath) as! CustomAddTraining
default:
break
}
switch indexPath.row{
case 0:
cell.textLabel?.text = "Choose Category"
case 1:
break
case 2:
cell.textLabel?.text = "Name Training"
case 3:
break
case 4:
break
default:
break
}
return cell
}
func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
return nil
}
CustomTableViewCell
import UIKit
class CustomAddTraining: UITableViewCell, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate {
let categoryList = ["Front", "Back", "Abnominal", "Leg", "Hip"]
var categorySelected = ""
var textFieldInputed = ""
var test = "test"
@IBOutlet weak var done: UIButton?
@IBOutlet weak var decideButton: UIButton?
@IBOutlet weak var myTextField: UITextField?
@IBOutlet weak var myPicker: UIPickerView?
override func awakeFromNib() {
super.awakeFromNib()
myTextField?.delegate = self
myTextField?.borderStyle = .RoundedRect
myPicker?.delegate = self
myPicker?.dataSource = self
decideButton?.hidden = true
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
func textFieldDidBeginEditing(textField: UITextField) {
decideButton!.hidden = false
}
func textFieldDidEndEditing(textField: UITextField) {
textFieldInputed = (textField.text)!
print(textFieldInputed)
print(categorySelected)
}
@IBAction func decideAction(sender: AnyObject) {
textFieldShouldReturn(myTextField!)
}
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
decideButton!.hidden = true
return true
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
myTextField!.resignFirstResponder()
return true
}
//pickerに表示する列数を返すデータ・ソースメソッド
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{
return 1
}
//行数を返す
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return categoryList.count
}
//表示するデータを返す
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return categoryList[row]
}
//セルを選択したときの処理 Realmに保存
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
categorySelected = categoryList[row]
print(categorySelected)
print(textFieldInputed)
}
@IBAction func saveRealmAction(sender: AnyObject) {
print(textFieldInputed)
print(categorySelected)
}
}