###実現したいこと
TableViewのセルをタップすると編集画面に遷移する。編集画面のTextFieldで編集内容を入力、更新ボタンをタップ、戻るボタンを押すとTableViewに更新内容が反映される。
###発生している問題
戻るボタンを押してもTableViewに更新内容が反映されない。
###試したこと
TableViewに表示する内容のリストをグロバール変数contentListに設定
↓
TableViewの画面から編集画面に遷移する際に、indexPath.rowの中身を変数numberを経由しprepare関数で渡す
↓
リストの中身を書き換える
contentList[number] = editTextField.text!
↓
delegateメソッドを使って、戻るボタンを押した際にTableViewの画面に更新内容を返すようにする
###考えたこと
contentList[number]の内容を編集画面のラベルに表示させてみたところうまくいったので、戻るボタンを押した時に更新内容を返すことができていないようです。
リスト内容の変更の部分以外は新規作成とほぼ同じ手順で行ったので、なぜうまくいかないのか原因が特定できていません。
###コードの内容
ViewController.swift
Swift
1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CatchProtocol { 4 5 6 7 8 var displayedContentList = [String]() 9 10 var selectedText: String? 11 12 var cellNumber: Int? 13 14 15 16 17 @IBOutlet weak var tableView: UITableView! 18 19 20 override func viewDidLoad() { 21 22 tableView.delegate = self 23 tableView.dataSource = self 24 25 if UserDefaults.standard.object(forKey: "Cell") != nil { 26 27 28 29 contentList = UserDefaults.standard.object(forKey: "ContentList") as! [String] 30 super.viewDidLoad() 31 32 33 } 34 35 36 37 // Do any additional setup after loading the view. 38 } 39 40 41 @IBAction func AddTransButton(_ sender: Any) { 42 43 performSegue(withIdentifier: "transAdd", sender: nil) 44 45 } 46 47 48 49 @IBAction func ScreenTransButton(_ sender: Any) { 50 51 performSegue(withIdentifier: "transScreen", sender: nil) 52 } 53 54 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 55 56 if segue.identifier == "transAdd" { 57 58 59 let addVC = segue.destination as! AddViewController 60 addVC.delegate = self 61 62 } 63 64 if segue.identifier == "transScreen" { 65 66 let screenVC = segue.destination as! ScreenViewController 67 screenVC.screenContentList = displayedContentList 68 } 69 70 if (segue.identifier == "transEdit") { 71 let editVC: EditViewController = (segue.destination as? EditViewController)! 72 73 74 editVC.text = selectedText! 75 editVC.number = cellNumber! 76 } 77 78 79 80 81 82 } 83 84 85 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 86 87 return displayedContentList.count 88 } 89 90 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 91 //変数を作る 92 let ContentCell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 93 //変数の中身を作る 94 ContentCell.textLabel!.text = displayedContentList[indexPath.row] 95 //戻り値の設定(表示する中身) 96 return ContentCell 97 } 98 99 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 100 101 selectedText = displayedContentList[indexPath.row] 102 cellNumber = indexPath.row 103 104 105 performSegue(withIdentifier: "transEdit", sender: nil) 106 107 } 108 109 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool{ 110 return true 111 } 112 113 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 114 115 if editingStyle == UITableViewCell.EditingStyle.delete { 116 117 displayedContentList.remove(at: indexPath.row) 118 tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic) 119 120 } 121 122 } 123 124 125 func catchData(contentList: Array<String>) { 126 displayedContentList = contentList 127 tableView.reloadData() 128 }
EditViewController.swift
Swift
1import UIKit 2 3class EditViewController: UIViewController, UITextFieldDelegate { 4 5 var text = String() 6 var number = Int() 7 var editContent = String() 8 9 var delegate:CatchProtocol? 10 11 @IBOutlet weak var editContentLabel: UILabel! 12 13 @IBOutlet weak var editTextField: UITextField! 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 editContentLabel.text = contentList[number] 19 editTextField.text = text 20 21 editTextField.delegate = self 22 23 // Do any additional setup after loading the view. 24 } 25 26 27 @IBAction func editButton(_ sender: Any) { 28 editContent = editTextField.text! 29 30 contentList[number] = editContent 31 32 33 34 editContentLabel.text = contentList[number] 35 36 editTextField.text = "" 37 38 UserDefaults.standard.set(contentList, forKey: "ContentList" ) 39 40 } 41 42 @IBAction func back(_ sender: Any) { 43 delegate?.catchData(contentList: contentList) 44 dismiss(animated: true, completion: nil) 45 }
画面遷移図
原因が分かる方いらっしゃいましたらご教授ください。何卒よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/27 09:23