🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2308閲覧

編集画面からTableViewに更新内容を反映できない

shuhei-cyf

総合スコア15

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/10/27 05:20

編集2019/10/27 05:21

###実現したいこと
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 }

画面遷移図

イメージ説明

原因が分かる方いらっしゃいましたらご教授ください。何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純にデリゲートが設定されていないからではないでしょうか?

swift

1let editVC: EditViewController = (segue.destination as? EditViewController)! 2editVC.text = selectedText! 3editVC.number = cellNumber! 4 5editVC.delegate = self // ここ

投稿2019/10/27 06:53

usagi001

総合スコア208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shuhei-cyf

2019/10/27 09:23

見落としていました。。 ご指摘ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問