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

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

詳細はこちら
Swift

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

Q&A

解決済

1回答

979閲覧

[swift 5] 新しい文章を追加した時にcellが2つになるのを避けたい。

Kaguya_4869

総合スコア117

Swift

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

0グッド

0クリップ

投稿2019/11/23 03:42

#質問したいこと
今メモ帳アプリを作成中です。
うまくいい表すことができないのですが、ホーム画面からcellをタップして詳細画面にいき詳細画面で文章を編集して保存するとcellが新たに増えてしまっています。(写真を下の方に掲示しています。)
#コード

swift

1//ホーム画面 2import UIKit 3 4class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 5 6 @IBOutlet weak var memoTableView: UITableView! 7 8 var memoArray = [String]() 9 10 let ud = UserDefaults.standard 11 12 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 13 return memoArray.count 14 } 15 16 17 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 18 let cell = tableView.dequeueReusableCell(withIdentifier: "memoCell", for: indexPath) 19 cell.textLabel?.text = memoArray[indexPath.row] 20 return cell 21 } 22 23 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 24 self.performSegue(withIdentifier: "toDetail", sender: nil) 25 //押したら押した状態を解除 26 tableView.deselectRow(at: indexPath, animated: true) 27 } 28 29 30 override func viewDidLoad() { 31 super.viewDidLoad() 32 33 memoTableView.delegate = self 34 memoTableView.dataSource = self 35 } 36 override func viewWillAppear(_ animated: Bool) { 37 loadMemo() 38 } 39 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 40 //destinationのクラッシュ防ぐ 41 if segue.identifier == "toDetail"{ 42 //detailViewControllerを取得 43 //as! DetailViewControllerでダウンキャストしている 44 let detailViewController = segue.destination as! DetailViewController 45 //遷移前に選ばれているCellが取得できる 46 let selectedIndexPath = memoTableView.indexPathForSelectedRow! 47 detailViewController.selectedMemo = memoArray[selectedIndexPath.row] 48 detailViewController.selectedRow = selectedIndexPath.row 49 } 50 } 51 func loadMemo(){ 52 if ud.array(forKey: "memoArray") != nil{ 53 //取得 またas!でアンラップしているのでnilじゃない時のみ 54 memoArray = ud.array(forKey: "memoArray") as![String] 55 //reloadしてくれる 56 memoTableView.reloadData() 57 } 58 } 59 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 60 61 if editingStyle == .delete { 62 63 //resultArray内のindexPathのrow番目をremove(消去)する 64 memoArray.remove(at: indexPath.row) 65 66 //再びアプリ内に消去した配列を保存 67 ud.set(memoArray, forKey: "memoArray") 68 69 //tableViewを更新 70 tableView.reloadData() 71 } 72 } 73} 74

swift

1//詳細画面 2 3import UIKit 4 5class DetailViewController: UIViewController { 6 7 @IBOutlet weak var memoTextView: UITextView! 8 9 var selectedRow:Int! 10 var selectedMemo : String! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 memoTextView.text = selectedMemo 15 let kbToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 40)) 16 kbToolBar.barStyle = UIBarStyle.default // スタイルを設定 17 kbToolBar.sizeToFit() // 画面幅に合わせてサイズを変更 18 // スペーサー 19 let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil) 20 // 閉じるボタン 21 let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(self.commitButtonTapped)) 22 kbToolBar.items = [spacer, commitButton] 23 memoTextView.inputAccessoryView = kbToolBar 24 } 25 26 @objc func commitButtonTapped() { 27 self.view.endEditing(true) 28 } 29 30 //画面遷移する時にタップするボタン 31 @IBAction func save(_ sender: Any) { 32 33 let inputText = memoTextView.text 34 let ud = UserDefaults.standard 35 if ud.array(forKey: "memoArray") != nil{ 36 //saveMemoArrayに取得 37 var saveMemoArray = ud.array(forKey: "memoArray") as! [String] 38 //テキストに何か書かれているか? 39 if inputText != ""{ 40 //配列に追加 41 saveMemoArray.append(inputText!) 42 ud.set(saveMemoArray, forKey: "memoArray") 43 }else{ 44 showAlert(title: "何も入力されていません") 45 46 } 47 48 }else{ 49 //最初、何も書かれていない場合 50 var newMemoArray = [String]() 51 //nilを強制アンラップはエラーが出るから 52 if inputText != ""{ 53 //inputtextはoptional型だから強制アンラップ 54 newMemoArray.append(inputText!) 55 ud.set(newMemoArray, forKey: "memoArray") 56 }else{ 57 showAlert(title: "何も入力されていません") 58 } 59 } 60 showAlert(title: "保存完了") 61 ud.synchronize() 62 } 63 64 func showAlert(title:String){ 65 let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert) 66 67 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 68 69 alert.addAction(UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)) 70 71 self.present(alert, animated: true, completion:nil) 72 } 73 //削除ボタン 74 @IBAction func deleteMemo(_ sender: Any) { 75 let ud = UserDefaults.standard 76 if ud.array(forKey: "memoArray") != nil{ 77 var saveMemoArray = ud.array(forKey: "memoArray") as![String] 78 saveMemoArray.remove(at: selectedRow) 79 ud.set(saveMemoArray, forKey: "memoArray" ) 80 ud.synchronize() 81 //画面遷移 82 self.navigationController?.popViewController(animated: true) 83 } 84 } 85 86 //シェアボタン 87 @IBAction func showActivityView(_ sender: UIBarButtonItem) { 88 let activitycontroller = UIActivityViewController(activityItems: [memoTextView], applicationActivities: nil) 89 90 self.present(activitycontroller, animated: true, completion: nil) 91 } 92 93} 94

#画像
ホーム画面
詳細画面
詳細画面で編集後のホーム画面

語彙力なくて本当にすみません。
少し急いでいます。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1//配列に追加 2saveMemoArray.append(inputText!)

配列に追加しているから(updateしなければいけないのに、insertしている)、Cellが増えるのは当然です。

前の画面から持ってきている selectedRow を使って、対象の要素にアクセス、それを書き換えないといけません。(検証していないけど大体こんな感じです)

swift

1saveMemoArray[selectedRow] = inputText! 2ud.set(saveMemoArray, forKey: "memoArray")

投稿2019/11/23 04:26

Rino-T_C

総合スコア95

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

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

Kaguya_4869

2019/11/23 06:19

迅速な対応ありがとうございます!! とても助かりました!ありがとうございます!
退会済みユーザー

退会済みユーザー

2019/11/23 07:13 編集

Rino-T_Cさん、Kaguya_4869さんについてTwitterで呟いとる。 (ごめんなさい、全く関係のないことなので、無視してください。むしろ無視していただいた方が助かります。) なんか、ごめんなさい。衝撃を受けてたみたいですね・・・(これも無視して結構です。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問