前提・実現したいこと
プログラミングを始めて2ヶ月の者です。
リストアプリを作成しております。(iPhoneのメモアプリのような仕組み)
tableviewcellをタップした際に、画面遷移させることはできましたが、
遷移先のtextfieldに文字を入力して、それを保存すると別のcellに格納されてしまいます。
tableviewcellと遷移先のtextfieldを紐付けて保存したいです。
発生している問題・エラーメッセージ
textfieldに文字を入力して保存すると、違うcellに保存されてしまう
該当のソースコード
ViewController
1import UIKit 2import RealmSwift 3 4class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 private var labelName: String? 7 private var text1Name: String? 8 private var text2Name: String? 9 10 @IBOutlet weak var tableView: UITableView! 11 12 var itemList: Results<Item>! 13 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 // Realmからデータを取得 19 do{ 20 let realm = try Realm() 21 itemList = realm.objects(Item.self) 22 }catch{ 23 } 24 25 title = "リスト" 26 27 tableView.dataSource = self 28 tableView.delegate = self 29 tableView.tableFooterView = UIView(frame: .zero) 30 31 32 // Do any additional setup after loading the view. 33 } 34 35 36 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 37 if (segue.identifier == "showSecondView") { 38 let secondVC = segue.destination as! SecondViewController 39 secondVC.getName = self.labelName! 40 let thirdVC = segue.destination as! SecondViewController 41 thirdVC.getText1 = self.text1Name! 42 let fourthVC = segue.destination as! SecondViewController 43 fourthVC.getText2 = self.text2Name! 44 45 } 46 } 47 48 49 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 50 return itemList.count 51 } 52 53 // 各行に表示するセルを返す 54 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "NameCell", for: indexPath) 56 let item = itemList[indexPath.row] 57 cell.textLabel?.text = item.title 58 return cell 59 } 60 61 // セルタップ時のイベント 62 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 63 let item = itemList[indexPath.row] 64 self.labelName = item.title 65 self.text1Name = item.name1 66 self.text2Name = item.name2 67 performSegue(withIdentifier: "showSecondView",sender: nil) 68 69 } 70 71 //追加ボタンで新規作成 72 @IBAction func addButton(_ sender: Any) { 73 var textField = UITextField() 74 let alert = UIAlertController(title: "アイテムを追加", message: "", preferredStyle: .alert) 75 let action = UIAlertAction(title: "リストに追加", style: .default) { (action) in 76 let newItem = Item() 77 // textFieldに入力したデータをnewItemのtitleに代入 78 newItem.title = textField.text! 79 // インスタンスをRealmに保存 80 do{ 81 let realm = try Realm() 82 try realm.write({ () -> Void in 83 realm.add(newItem) 84 }) 85 }catch{ 86 } 87 //データをリロードする 88 self.tableView.reloadData() 89 } 90 alert.addTextField { (alertTextField) in 91 alertTextField.placeholder = "NEWアイテム" 92 textField = alertTextField 93 } 94 alert.addAction(action) 95 present(alert, animated: true, completion: nil) 96 } 97 98 //スワイプしたセルを削除 99 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 100 if editingStyle == UITableViewCell.EditingStyle.delete { 101 // Realm内のデータを削除 102 do{ 103 let realm = try Realm() 104 try realm.write { 105 realm.delete(self.itemList[indexPath.row]) 106 } 107 tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.fade) 108 }catch{ 109 } 110 } 111 } 112 113} 114
SecondViewController
1import UIKit 2import RealmSwift 3 4class SecondViewController: UIViewController, UITextFieldDelegate { 5 6 var getName: String = "" 7 var getText1: String = "" 8 var getText2: String = "" 9 10 var itemList: Results<Item>! 11 12 @IBOutlet weak var labelName: UILabel! 13 14 @IBOutlet weak var textField1: UITextField! 15 @IBOutlet weak var textField2: UITextField! 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 // Labelへ格納 21 self.labelName.text = getName 22 //テキストへ格納 23 self.textField1.text = getText1 24 self.textField2.text = getText2 25 26 27 textField1.delegate = self 28 textField2.delegate = self 29 30 // Do any additional setup after loading the view. 31 } 32 33 //完了ボタンでキーボードを閉じる 34 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 35 self.view.endEditing(true) 36 // Itemクラスのインスタンス作成 37 let newItem = Item() 38 // TextFieldの値を代入 39 newItem.name1 = textField1.text! 40 newItem.name2 = textField2.text! 41 // インスタンスをRealmに保存 42 do{ 43 let realm = try Realm() 44 try realm.write({ () -> Void in 45 realm.add(newItem) 46 }) 47 }catch{ 48 } 49 return true 50 51 } 52 53 //他画面タッチでキーボードを閉じる 54 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 55 self.view.endEditing(true) 56 // Itemクラスのインスタンス作成 57 let newItem = Item() 58 // TextFieldの値を代入 59 newItem.name1 = textField1.text! 60 newItem.name2 = textField2.text! 61 // インスタンスをRealmに保存 62 do{ 63 let realm = try Realm() 64 try realm.write({ () -> Void in 65 realm.add(newItem) 66 }) 67 }catch{ 68 } 69 return 70 } 71 72} 73
Item
1import Foundation 2import RealmSwift 3 4class Item: Object { 5 // タイトル 6 @objc dynamic var title: String? = "" 7 // 内容 8 @objc dynamic var name1 = "" 9 @objc dynamic var name2 = "" 10}
試したこと
userdefaultの保存など他の方法がないか沢山調べましたが、わかりませんでした、、、
todoリストの作り方は多々あったのですが、画面遷移してその内容を保存するものが見つかりませんでした。
また自分の知識不足で理解することができない内容が多く困っています。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー