前提・実現したいこと
TODOリストを作成しています。
・画面A(Todo一覧表示)
・画面B(Aをタップした時の詳細)
・画面C(Todo内容作成画面)
・CでTodo内容をTextViewに書き、完了押すとテキストデータをUserDefaultsに入れて画面Aに反映される
・画面Bに遷移した時にAの内容を表示
ここまで出来たのですが、
Bの内容を編集した時にAに反映させることが出来なくて困っています…
Todo内容は画面Cで完了を押した際にUserDefaultsに保存しています。
画面A
import UIKit class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource{ var celltapped:Int = 0 var tweetArray:[String] = [] @IBOutlet var tableview: UITableView! override func viewDidLoad() { super.viewDidLoad() setup() } override func viewWillAppear(_ animated: Bool) { tweetArray = UserDefaults.standard.array(forKey: "tweet") as? [String] ?? [] tableview.reloadData() } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { tweetArray.remove(at: indexPath.row) UserDefaults.standard.set(tweetArray, forKey: "tweet") UserDefaults.standard.synchronize() tableview.reloadData() } } private func setup(){ self.navigationController?.navigationBar.barStyle = .black self.navigationController?.navigationBar.tintColor = .white self.navigationController?.navigationBar.barTintColor = .systemBlue self.navigationController?.navigationBar.titleTextAttributes = [ .foregroundColor: UIColor.white] tableview.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height) tableview.delegate = self tableview.dataSource = self } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tweetArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell") cell.selectionStyle = .none cell.textLabel?.numberOfLines = 3 cell.textLabel?.text = tweetArray[indexPath.row] return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { celltapped = indexPath.row performSegue(withIdentifier: "detail", sender: nil) } @IBAction func tweet(_ sender: Any) { performSegue(withIdentifier: "tweet", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "detail" { let nextVC = segue.destination as! detailViewController nextVC.tweetDetail = tweetArray[celltapped] } } }
画面B
import UIKit class detailViewController: UIViewController,UINavigationControllerDelegate { var textview = UITextView() var tweetDetail:String = "" override func viewDidLoad() { super.viewDidLoad() text() navigationController?.delegate = self } private func text(){ textview.frame = CGRect(x: 20, y: 110, width: view.frame.width - 40, height: view.frame.height) textview.text = tweetDetail textview.font = UIFont.systemFont(ofSize: 20) self.view.addSubview(textview) self.textview.becomeFirstResponder() } }
試したこと
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { if viewController is ViewController { var textsave: [String] = UserDefaults.standard.array(forKey: "tweet") as? [String] ?? [] textsave.append(self.textview.text!) UserDefaults.standard.set(textsave, forKey: "tweet") UserDefaults.standard.synchronize() } }
上のコードで更新できるかなと思って試してみたのですが、画面Aに新しいセルが追加されるだけでした…
didChangeNotificationで入力値に変更があった場合の処理を書こうともしてみましたが、
UserDefaultsの中身を変更する処理がわからず心折れてしまいました…
お手数おかけしますが何卒よろしくお願い致します……
ツールのバージョン
Xcode : Version 11.0
Swift : Apple Swift version 5.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。