質問編集履歴

3 誤字の修正

tarofess

tarofess score 125

2017/01/11 07:55  投稿

Realmで値の保存を遅らせたい
現在以下の画面のようにtableviewのセルに3つtextfieldがあります。
![screen説明](965b76973961db762920a42cfc0e0b61.png)
そして画面右上のOKが押されるとtextfieldの値がrealmに保存されるようにしていたのですが、コードを書いている時にtextfieldの編集が終わった時点でrealmに値が保存されることに気づきました。コードは以下のようになっています。
```swift
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
       let realm = try! Realm()
       
       switch textField.tag {
       case CellTextField.name.rawValue:
           try! realm.write {
               self.product?.name = textField.text
           }
           
       case CellTextField.category.rawValue:
           try! realm.write {
               self.product?.category = textField.text
           }
           
       case CellTextField.price.rawValue:
           try! realm.write {
               if !textField.text!.isEmpty {
                   self.product?.price.value = Int(textField.text!)
               }
           }
           
       default:
           break
       }
       return true
   }
```
textfieldを編集しても画面左上のCencelが押されれば値は保存されないようにしたいので上記のコードではダメだと思いました。
なのでOKボタンのアクションのハンドラ内でrealmへの保存を行いたいのですが、realmでは値の保存を遅らせたりすることはできるのでしょうか?
その他例えばダミーのProductクラスを一つ作って、上記コードのtextFieldShouldEndEditingでそのダミーProductのインスタンスに値を入れつつ、OKが押された時にダミーのProductをrealmのProductに流しこもうかなと思ったのですが、手間がかかって面倒だと思いました......。
realmへの値の保存を遅らせるだけでなく、その他何かいい方法があれば教えていただきたいです。
よろしくお願いします。
///回答を受けての追記///
```swift
       let realm = try! Realm()
       self.view.subviews.forEach({ view in
           if let textField = view as? NameEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
           if let textField = view as? CategoryEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
           if let textField = view as? PriceEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
       })
```
///更なる追記///
1.
1:
```swift
class NameEditTableViewCell: UITableViewCell {
   @IBOutlet weak var nameTextField: UITextField!
   
}
class CategoryEditTableViewCell: UITableViewCell {
   
   @IBOutlet weak var categoryTextField: UITextField!
}
class PriceEditTableViewCell: UITableViewCell {
   
   @IBOutlet weak var priceTextField: UITextField!
   
}
```
2. はい、viewcontrollerのフィールドにstoryboardのtableviewから引っ張ってきたtableviewのインスタンスがあります。
2: はい、viewcontrollerのフィールドにstoryboardのtableviewから引っ張ってきたtableviewのインスタンスがあります。
3.
3:
```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let type = self.displayCells()[indexPath.row]
       let id = type.rawValue
       let cell = self.tableView.dequeueReusableCell(withIdentifier: id, for: indexPath)
       self.configureCell(targetCell: cell, type: type)
       
       return cell
   }
func configureCell(targetCell: UITableViewCell, type: CellType) {
       switch type {
       case .name:
           if let cell = targetCell as? NameEditTableViewCell {
               cell.nameTextField.text = self.product?.name
               cell.nameTextField.delegate = self
           }
       case .category:
           if let cell = targetCell as? CategoryEditTableViewCell {
               cell.categoryTextField.text = self.product?.category
               cell.categoryTextField.delegate = self
           }
       case .price:
           if let cell = targetCell as? PriceEditTableViewCell {
               if let price = self.product?.price.value {
                   cell.priceTextField.text = String(describing: price)
               }
               cell.priceTextField.delegate = self
           }
       }
   }
```
  • iOS

    5834 questions

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

  • Swift

    11299 questions

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

  • Realm

    326 questions

    RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

2 回答を受けての追記part2

tarofess

tarofess score 125

2017/01/11 07:54  投稿

Realmで値の保存を遅らせたい
現在以下の画面のようにtableviewのセルに3つtextfieldがあります。
![screen説明](965b76973961db762920a42cfc0e0b61.png)
そして画面右上のOKが押されるとtextfieldの値がrealmに保存されるようにしていたのですが、コードを書いている時にtextfieldの編集が終わった時点でrealmに値が保存されることに気づきました。コードは以下のようになっています。
```swift
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
       let realm = try! Realm()
       
       switch textField.tag {
       case CellTextField.name.rawValue:
           try! realm.write {
               self.product?.name = textField.text
           }
           
       case CellTextField.category.rawValue:
           try! realm.write {
               self.product?.category = textField.text
           }
           
       case CellTextField.price.rawValue:
           try! realm.write {
               if !textField.text!.isEmpty {
                   self.product?.price.value = Int(textField.text!)
               }
           }
           
       default:
           break
       }
       return true
   }
```
textfieldを編集しても画面左上のCencelが押されれば値は保存されないようにしたいので上記のコードではダメだと思いました。
なのでOKボタンのアクションのハンドラ内でrealmへの保存を行いたいのですが、realmでは値の保存を遅らせたりすることはできるのでしょうか?
その他例えばダミーのProductクラスを一つ作って、上記コードのtextFieldShouldEndEditingでそのダミーProductのインスタンスに値を入れつつ、OKが押された時にダミーのProductをrealmのProductに流しこもうかなと思ったのですが、手間がかかって面倒だと思いました......。
realmへの値の保存を遅らせるだけでなく、その他何かいい方法があれば教えていただきたいです。
よろしくお願いします。
///回答を受けての追記///
```Swift
```swift
       let realm = try! Realm()
       self.view.subviews.forEach({ view in
           if let textField = view as? NameEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
           if let textField = view as? CategoryEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
           if let textField = view as? PriceEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
       })
```  
 
///更なる追記///  
 
1.  
```swift  
class NameEditTableViewCell: UITableViewCell {  
 
   @IBOutlet weak var nameTextField: UITextField!  
     
}  
 
class CategoryEditTableViewCell: UITableViewCell {  
     
   @IBOutlet weak var categoryTextField: UITextField!  
}  
 
class PriceEditTableViewCell: UITableViewCell {  
     
   @IBOutlet weak var priceTextField: UITextField!  
     
}  
```  
 
2. はい、viewcontrollerのフィールドにstoryboardのtableviewから引っ張ってきたtableviewのインスタンスがあります。  
 
3.  
```swift  
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {  
       let type = self.displayCells()[indexPath.row]  
       let id = type.rawValue  
       let cell = self.tableView.dequeueReusableCell(withIdentifier: id, for: indexPath)  
       self.configureCell(targetCell: cell, type: type)  
         
       return cell  
   }  
 
func configureCell(targetCell: UITableViewCell, type: CellType) {  
       switch type {  
       case .name:  
           if let cell = targetCell as? NameEditTableViewCell {  
               cell.nameTextField.text = self.product?.name  
               cell.nameTextField.delegate = self  
           }  
       case .category:  
           if let cell = targetCell as? CategoryEditTableViewCell {  
               cell.categoryTextField.text = self.product?.category  
               cell.categoryTextField.delegate = self  
           }  
       case .price:  
           if let cell = targetCell as? PriceEditTableViewCell {  
               if let price = self.product?.price.value {  
                   cell.priceTextField.text = String(describing: price)  
               }  
               cell.priceTextField.delegate = self  
           }  
       }  
   }  
 
```
  • iOS

    5834 questions

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

  • Swift

    11299 questions

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

  • Realm

    326 questions

    RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

1 回答を受けて追記

tarofess

tarofess score 125

2017/01/10 21:48  投稿

Realmで値の保存を遅らせたい
現在以下の画面のようにtableviewのセルに3つtextfieldがあります。
![screen説明](965b76973961db762920a42cfc0e0b61.png)
そして画面右上のOKが押されるとtextfieldの値がrealmに保存されるようにしていたのですが、コードを書いている時にtextfieldの編集が終わった時点でrealmに値が保存されることに気づきました。コードは以下のようになっています。
```swift
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
       let realm = try! Realm()
       
       switch textField.tag {
       case CellTextField.name.rawValue:
           try! realm.write {
               self.product?.name = textField.text
           }
           
       case CellTextField.category.rawValue:
           try! realm.write {
               self.product?.category = textField.text
           }
           
       case CellTextField.price.rawValue:
           try! realm.write {
               if !textField.text!.isEmpty {
                   self.product?.price.value = Int(textField.text!)
               }
           }
           
       default:
           break
       }
       return true
   }
```
textfieldを編集しても画面左上のCencelが押されれば値は保存されないようにしたいので上記のコードではダメだと思いました。
なのでOKボタンのアクションのハンドラ内でrealmへの保存を行いたいのですが、realmでは値の保存を遅らせたりすることはできるのでしょうか?
その他例えばダミーのProductクラスを一つ作って、上記コードのtextFieldShouldEndEditingでそのダミーProductのインスタンスに値を入れつつ、OKが押された時にダミーのProductをrealmのProductに流しこもうかなと思ったのですが、手間がかかって面倒だと思いました......。
realmへの値の保存を遅らせるだけでなく、その他何かいい方法があれば教えていただきたいです。
よろしくお願いします。
よろしくお願いします。
///回答を受けての追記///
```Swift
       let realm = try! Realm()
       self.view.subviews.forEach({ view in
           if let textField = view as? NameEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
           if let textField = view as? CategoryEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
           if let textField = view as? PriceEditTableViewCell {
               try! realm.write {
                   self.product?.name = textField.textLabel?.text
               }
           }
       })
```
  • iOS

    5834 questions

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

  • Swift

    11299 questions

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

  • Realm

    326 questions

    RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

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