質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.78%

TodoListの作成:IndexPathで配列の上書き

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 265

score 1

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • hameji001

    2020/12/09 00:50

    画面Aにおいて、選択したindexPath.rowを次の画面Cに渡す必要があると思います。

    具体的には
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { }
    を用意して、画面CのVCに渡してください。

    参照
    https://qiita.com/treastrain/items/8c298886cc8f3cf124f2

    キャンセル

  • Gingami09

    2021/02/03 15:56

    回答ありがとうございます!問題は解決できました!

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る