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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Xcode

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

Swift

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

Q&A

解決済

2回答

1547閲覧

tableviewcellの削除と移行先のデータの削除

sumire06

総合スコア15

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/04/17 23:21

編集2020/04/18 02:14

イメージ説明### tableviewcellをスワイプして削除したい。遷移先のデータも削除したい。

調べたコードを入れるとスワイプの状態にはなりますがdeleteボタンを押すとクラッシュします。
一番下のコードが追加したコードです。

また、cellの情報を削除するとセルの遷移先の情報も削除されるのかを教えていただけると嬉しいです。

・・追加

追加したコードは問題ではなさそうでした。
他のコードに問題があるのですね。
どこに問題があるか教えていただけると嬉しいです。
よろしくお願いいたします。

・・・追加
現在、このようなコードになっております。
よろしくお願いいたします。

swift

1import UIKit 2private let unselectedRow = -1 3 4class MemoViewController: UIViewController,UITableViewDataSource, UITextFieldDelegate,UITableViewDelegate { 5 6 7 8 @IBOutlet weak var editMemoField: UITextField! 9 10 @IBOutlet weak var memoListView: UITableView! 11 12 13 let userDefaults = UserDefaults.standard 14 15 16 var memoList: [String] = [] 17 var editRow: Int = unselectedRow 18 var giveData: String = "" 19 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 24 memoListView.delegate = self 25 memoListView.dataSource = self 26 memoListView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") 27 editMemoField.becomeFirstResponder() 28 editMemoField.keyboardType = UIKeyboardType.emailAddress 29 30 31 32 if let aaa = userDefaults.object(forKey: "memoList") { 33 memoList = aaa as! Array<String> 34 } 35 } 36 37 38 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 39 memoList.append(textField.text!) 40 userDefaults.set(memoList, forKey: "memoList") 41 userDefaults.synchronize() 42 43 memoList = userDefaults.object(forKey: "memoList") as! Array<String> 44 45 46 47 self.memoListView.reloadData() //データをリロードする 48 textField.resignFirstResponder() 49 return true 50 51 } 52 53 override func didReceiveMemoryWarning() { 54 super.didReceiveMemoryWarning() 55 // Dispose of any resources that can be recreated. 56 } 57 58 59 60 61 62 @IBAction func tapSubmitButton(_ sender: Any) { 63 64 applyMemo() 65 66 } 67 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 68 69 return 12 70 } 71 72 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 73 74 75 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) 76 77 78 if indexPath.row >= memoList.count { 79 return cell 80 } 81 82 cell.textLabel?.text = memoList[indexPath.row] 83 84 return cell 85 86 } 87 88 89 90 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 91 92 93 94 95 if indexPath.row >= memoList.count { 96 97 return 98 } 99 100 101 editRow = indexPath.row 102 editMemoField.text = memoList[editRow] 103 giveData = memoList[indexPath.item] 104 if indexPath.row == 0 { 105 106 performSegue(withIdentifier: "toCell0", sender: nil) 107 108 109 110 }else if indexPath.row == 1 { 111 112 performSegue(withIdentifier: "toCell1", sender: nil) 113 114 115 116 ]・・・・・・ 117 118 119 } 120 121 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 122 123 if segue.identifier == "toCell0" { 124 125 let vc = segue.destination as! Cell0ViewController 126 vc.receiveData = giveData 127 128 ・・・・・・ 129 } 130 131 132 133 } 134 135 136 137 private func textFieldShouldReturn(textField: UITextField) -> Bool { 138 applyMemo() 139 return true 140 } 141 142 143 144 func applyMemo() { 145 if editMemoField.text == nil { 146 return 147 } 148 149 if editRow == unselectedRow { 150 memoList.append(editMemoField.text!) 151 152 } else { 153 memoList[editRow] = editMemoField.text! 154 userDefaults.set(memoList, forKey: "memoList") 155 userDefaults.synchronize() 156 157 memoList = userDefaults.object(forKey: "memoList") as! Array<String> 158 159 } 160 editMemoField.text = "" 161 editRow = unselectedRow 162 163 memoListView.reloadData() 164 165 166 } 167 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 168 169 if editingStyle == UITableViewCell.EditingStyle.delete{ 170 memoList.remove(at: indexPath.row) 171 tableView.deleteRows(at : [indexPath], with: .automatic) 172 } 173 } 174 175 176 177 178} 179 180

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

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

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

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

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

TsukubaDepot

2020/04/18 00:02

具体的に、どういう状態のときに、どういうエラーで落ちたのでしょうか。 ちなみに、追加したコードそのものは落ちる原因にはみえませんが、それ以外のところにいろいろ問題がありそうです。
TsukubaDepot

2020/04/18 01:33

追加で掲載されたコードは断片的なのでなんともコメントしがたいです。 MemoViewControllerだけでいいので、全てコピーして貼り付けてもらえませんか。
guest

回答2

0

swift

1func textFieldShouldReturn(_ textField: UITextField) -> Bool { 2 userDefaults.set(memoList, forKey: "memoList") 3 userDefaults.synchronize() 4 5 memoList = userDefaults.object(forKey: "memoList") as! Array<String> 6 7 self.memoListView.reloadData() //データをリロードする 8 textField.resignFirstResponder() 9 return true 10}

エラーが出る原因とは直接関係ありませんが、テキストボックスに文字を入力し、Enterを押した後に呼び出されるDelegate(textFieldShouldReturn())の中で、テキストボックスに入れた文字列を配列(memoList)に入れないまま処理が終わっています。

なので、UserDefaultsに入れる前に、まずは配列に文字列を入れる必要があります。
配列の末尾に追加するのであれば、こんな感じで追加できます。

swift

1func textFieldShouldReturn(_ textField: UITextField) -> Bool { 2 memoList.append(textField.text!) 3 4 userDefaults.set(memoList, forKey: "memoList") 5 // 以下略

エラーの本質は他のところの処理にあると思いますので、そちらはコードが追加されたらコメントします。

投稿2020/04/18 01:45

TsukubaDepot

総合スコア5086

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

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

0

ベストアンサー

tableView editingStyleのなかで

swift

1if editingStyle == UITableViewCell.EditingStyle.delete{ 2 memoList.remove(at : indexPath.row) 3 tableView.deleteRows(at : indexPath, with: .automatic) 4 }

なんじゃないの?


質問が編集されたので、回答編集します。

tableView(_:editingStyleForRowAt:)の中を↓に書き換えて実行するとコンソールになんと表示されますか?

swift

1func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 2 print("セルの数: (tableView.numberOfRows(inSection: 0)") 3 if editingStyle == UITableViewCell.EditingStyle.delete{ 4 memoList.remove(at : indexPath.row) 5 tableView.deleteRows(at : [indexPath], with: .automatic) 6 } 7}

画像を見るにセルが無いように見えますし、UITableViewDetaSourceの必須メソッドが書いてないですが、
削除以外はテーブルビューがきちんと機能した上での質問なのでしょうか?


質問が編集されたので追記します

tableView(_:numberOfRowsInSection:)の中でセルの数が固定となっています。可変するデータの個数を返してあげてください。

投稿2020/04/18 00:51

編集2020/04/18 02:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TsukubaDepot

2020/04/18 00:55

deleteRowsなので一つ目の引数は[indexPath]だと思います。[]とったら型が合わないのでエラーになっちゃいます。 deleteRowなら当然indexPathになりますが。
退会済みユーザー

退会済みユーザー

2020/04/18 00:58 編集

ああ、ごめんなさい。そっち方向で読み替えてくださいお願いします
sumire06

2020/04/18 03:00

無事できました。 みなさま本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問