前提・実現したいこと
TodoListを作ろうと考えています。
cellの編集画面にあるtextfieldに文字を入力すると、もともと入力してあった文字が編集画面のtextfieldで上書きされ、文字が更新されているようにしたいです。
画面A 入力したcellを一覧できる画面
画面B cellの追加画面
画面C cellの編集画面
発生している問題・エラーメッセージ
画面Cにおいて、どのようにindexPathを使えば、タップしたcellの内容を上書きできるのかわかりません。
拙い文章ですみません。
エラーメッセージ
該当のソースコード
画面A import UIKit class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var todolistTable: UITableView! override func viewWillAppear(_ animated:Bool) { super.viewWillAppear(animated) if UserDefaults.standard.object(forKey: "todoList") != nil { todoItem = UserDefaults.standard.object(forKey: "todoList") as! [String] } todolistTable.reloadData() } override func viewDidLoad() { super.viewDidLoad() } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return todoItem.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cellValue = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "cell") cellValue .textLabel?.text = todoItem[indexPath.row] return cellValue } // cellの編集許可 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { return true } // 追加:セルの削除機能 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == UITableViewCell.EditingStyle.delete { todoItem.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath as IndexPath], with: .automatic) UserDefaults.standard.set(todoItem , forKey: "todoList") todolistTable.reloadData() } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // セルの選択を解除 tableView.deselectRow(at: indexPath, animated: true) // 別の画面に遷移 performSegue(withIdentifier: "EditToDo", sender: nil) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) presentingViewController?.endAppearanceTransition() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) presentingViewController?.beginAppearanceTransition(true, animated: animated) presentingViewController?.endAppearanceTransition() } }
画面B import UIKit var todoItem = [String]() class AddToDo: UIViewController { @IBOutlet weak var itemText: UITextField! @IBAction func addItem(_ sender: AnyObject) { if itemText.text != "" { todoItem.append(itemText.text!) UserDefaults.standard.set(todoItem, forKey: "todoList") } dismiss(animated: true, completion: nil) } override func viewDidLoad() { super.viewDidLoad() } @IBAction func tapScreen(_ sender: UITapGestureRecognizer) {self.view.endEditing(true) } @IBAction func ReturnButton(_ sender: Any) { self.dismiss(animated: true, completion: nil) } override func viewWillAppear(_ animated: Bool) { presentingViewController?.beginAppearanceTransition(false, animated: animated) super.viewWillAppear(animated) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) presentingViewController?.endAppearanceTransition() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) presentingViewController?.beginAppearanceTransition(true, animated: animated) presentingViewController?.endAppearanceTransition() } }
画面C import UIKit class EditToDo: UIViewController { @IBOutlet weak var EditingTextField : UITextField! @IBAction func EditingButton(_ sender: AnyObject ){ if EditingTextField.text != "" { // todoItem.append(EditingTextField.text!) UserDefaults.standard.set(todoItem, forKey: "todoList") } dismiss(animated: true, completion: nil) } func Tableview(_ TableView : UITableView , cellForRowAt indexPath:IndexPath ) -> UITableViewCell { let celling = UITableViewCell() let edittextfield:Any = UITextField() let rowNumber = indexPath.row if rowNumber == todoItem.count { todoItem = edittextfield as! [String] } return celling } func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { return true } // 戻るボタン @IBAction func EditReturnButton(_ sender: Any) { self.dismiss(animated: true, completion: nil) } override func viewDidLoad() { super.viewDidLoad() } // タップするとキーボードがなくなる @IBAction func tapScreen(_ sender: UITapGestureRecognizer) {self.view.endEditing(true) } // 無限モーダル解消 override func viewWillAppear(_ animated: Bool) { presentingViewController?.beginAppearanceTransition(false, animated: animated) super.viewWillAppear(animated) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) presentingViewController?.endAppearanceTransition() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) presentingViewController?.beginAppearanceTransition(true, animated: animated) presentingViewController?.endAppearanceTransition() } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
swift5.3
Xcode12.0
あなたの回答
tips
プレビュー