前提・実現したいこと
度々のご質問失礼します。
下記状況において、Realmに登録したデータの更新(削除)方法がわかりません。
1.メインビューにてRealmにデータを登録
2.メインビュー内のセルをタップで別ビューに遷移し、値を編集する(モーダルで遷移)
3.別ビューで編集した値を登録する
4.別ビューに渡して編集済みの元の値は削除する
下記コードにて実装を試みているのですが、そもそもの考えとして、上記3と4は分ける必要はあるのでしょうか?
色々なサイトやTeratail内の質問も見たのですが、3と4を一度にやる方法(上書き)が分からないため、
別々に試しています。
その上でご教示いただきたいのですが、上記3と4を一度に行う方法はあるのでしょうか?
また、別々に行う場合、4については下記コードをどのように修正していけば良いのでしょうか?
メインビューから選択されたセルのindexPathを渡すなど色々と試してみたのですが、
RealmでのindexPathの扱い方などがわかりません。
お手数をおかけしますが、よろしくお願いいたします。
該当のソースコード
ViewController
1mport UIKit 2import RealmSwift 3 4class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 var realm: Realm! 7 var phraseList: Results<PhraseItem>! 8 9 @IBOutlet weak var inputTextView: UITextView! 10 11 @IBOutlet weak var tableView: UITableView! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 tableView.delegate = self 17 tableView.dataSource = self 18 } 19 20 override func viewWillAppear(_ animated: Bool) { 21 realm = try! Realm() 22 phraseList = realm.objects(PhraseItem.self) 23 24 tableView.reloadData() 25 } 26 27 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 28 return phraseList.count 29 } 30 31 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 32 let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) 33 cell.textLabel?.text = phraseList[indexPath.row].phrase 34 35 return cell 36 } 37 38 @IBAction func inputButton(_ sender: Any) { 39 let newPhrase = PhraseItem() 40 newPhrase.phrase = inputTextView.text! 41 42 let realm = try! Realm() 43 try! realm.write { 44 realm.add(newPhrase) 45 } 46 47 inputTextView.endEditing(true) 48 inputTextView.text = "" 49 self.tableView.reloadData() 50 } 51 52 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 53 tableView.deselectRow(at: indexPath, animated: false) 54 performSegue(withIdentifier: "goEdit", sender: indexPath.row) 55 } 56 57 func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { 58 } 59 60 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 61 if let indexPath = tableView.indexPathForSelectedRow { 62 let selectedRow = indexPath.row 63 let editVC = segue.destination as! EditViewController 64 editVC.receiveText = phraseList[selectedRow].phrase 65 editVC.receiveRow = selectedRow 66 67 print(editVC.receiveText) 68 print(editVC.receiveRow) 69 } 70 } 71 72} 73
EditViewController
1import UIKit 2import RealmSwift 3 4class EditViewController: UIViewController { 5 6 var receiveText: String? 7 8 var receiveRow: Int? 9 10 @IBOutlet weak var editTextView: UITextView! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 editTextView.text = receiveText 16 } 17 18 @IBAction func editButton(_ sender: Any) { 19 if let editText = editTextView.text { 20 let realm = try! Realm() 21 let editedText = PhraseItem() 22 editedText.phrase = editText 23 try! realm.write { 24 realm.add(editedText) 25 } 26 } 27 dismiss(animated: true, completion: nil) 28 } 29}
PhraseItem
1import UIKit 2import RealmSwift 3 4class PhraseItem: Object { 5 @objc dynamic var phrase = "" 6 7}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/19 03:22
2019/06/20 02:41