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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

Q&A

解決済

2回答

2638閲覧

tableviewの削除ボタンが反応しない

退会済みユーザー

退会済みユーザー

総合スコア0

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/02/16 15:48

前提・実現したいこと

tableviewの編集モードで削除ボタン(マイナスボタン)を押すと横からdeleteが表示されて、セルを削除できるようにしたいです

発生している問題・エラーメッセージ

イメージ説明
削除ボタン(マイナスボタン)は表示されましたが、押しても反応しません
並び替えはできるようになりました

該当のソースコード

import UIKit class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self tableView.isEditing = true } } extension TabManagementViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 3 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableView cell.textLabel?.text = "サンプル" return cell } // セルの削除 // func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { print("削除①") // 押しても表示されませんでした if editingStyle == .delete { print("削除②") // こちらも同様に押しても表示されませんでした tableView.deleteRows(at: [indexPath], with: .automatic) } } func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { // 並び替え } }

試したこと

tableView.allowsSelection = true

tableView.allowsSelectionDuringEditing = true

をviewDidLoad()の中に追加してみましたが、何も変わりませんでした

func tableView(_ tableView: UITableView,canEditRowAt indexPath: IndexPath) -> Bool{ return true }

を// セルの削除 //の前に追加しましたが、同じく何も変わりませんでした

補足情報(FW/ツールのバージョンなど)

最近、swiftの勉強を始めたばかりで質問するのも今回が初めてなので至らない点があると思いますが、どうぞよろしくお願いします

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

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

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

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

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

guest

回答2

0

ベストアンサー

tableViewDelegateDataSource の処理先が ViewController (つまりself)になっていますが、実際にプロトコル準拠しているクラスや、求められている関数を定義しているクラスが別のクラス(TabManagementViewController)になっているので意図した動きになっていないのではないでしょうか。

つまり、

swift

1class ViewController: UIViewController { 2 3 @IBOutlet weak var tableView: UITableView! 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // ここの設定が自身のクラスになっている 8 tableView.dataSource = self 9 tableView.delegate = self 10   11 } 12 13}

としているにもかかわらず、実際にdelegate などを宣言しているのは、別のクラス(の拡張)である

swift

1extension TabManagementViewController: UITableViewDataSource { 2 3 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 4 return 3 5 } 6 /// 以下略 7}

としている問題のような気がします。

selfじゃなくて、TabManagementViewController クラスのインスタンスを指定しなければいけないのではないでしょうか。

あるいは、delegate先を自分自身にするのであれば、ViewControllerクラスをUITableViewDataSourceUITableViewDelegateプロトコルに準拠させて、次のような感じに書けばいいような気がします。

TableViewを表示させて削除させるための簡単なサンプルです)

swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 @IBOutlet weak var tableView: UITableView! 6 7 var cellData = ["カクレクマノミ", "ナンヨウハギ", "キイロハギ", "ロイヤルグラマ"] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view. 12 13 tableView.delegate = self 14 tableView.dataSource = self 15 // 編集可能にする -> 削除アイコンを表示する 16 // tableView.isEditing = false の場合はスワイプで削除 17 //tableView.isEditing = true 18 } 19 20 // セルの個数を返す datasource 21 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 22 return cellData.count 23 } 24 25 // セルにデータを表示する datasource 26 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 27 let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) 28 cell.textLabel!.text = cellData[indexPath.row] 29 30 return cell 31 } 32 33 // セルの編集許可 34 // この関数がない場合はデフォルトで削除可能 35 // false を返すと削除できない 36// func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 37// return false 38// } 39 40 // スワイプしたセルを削除 41 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 42 if editingStyle == .delete { 43 // 実データの削除 44 cellData.remove(at: indexPath.row) 45 46 // 表示するデータの削除 47 tableView.deleteRows(at: [indexPath], with: .automatic) 48 } 49 } 50}

投稿2020/02/18 04:40

TsukubaDepot

総合スコア5086

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

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

0

よく読んでませんでした。ごめんなさい。

cellForRowAtの中身ができてませんので、削除とか並び替えよりも先にきちんと表示できるようにしてみてください。
tableViewを表示するveiwcontrollerもどれなのかわかりません。

このへんでも参考にしてみてください

UITableViewDelegateにも

swift

1 2extension TabManagementViewController: UITableViewDataSource, UITableViewDelegate { 3 4} 5

投稿2020/02/16 16:40

編集2020/02/16 17:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/02/16 17:35

回答ありがとうございます UITableViewDelegateを加えてみましたが、同じく反応しませんでした viewDidLoad()の中にtableView.delegate = selfは入れました
h_crane

2020/02/17 16:55

問題点が2つ ① 表面的にセルだけ消しても消えないかと思います。 裏側のデータを消してからでないと更新してもセルは元のままかと思います。 (裏側消さなくても消そうと思えば消せますが) ② 今回の場合は``numberOfRowsInSection ``で3を返してしまっているので、ずっとかわらないかと、、。 適当に ``var model: [String] = ["a", "b", "c"]`` と定義して、numberOfRowsInSectionでは``model.count``を返しましょう。 その上で①を解決しましょう。 ①は以下で解決。 少し古いですが、簡潔なので以下を添付しておきます。 https://qiita.com/Lulu34/items/b0c88d1e1163d50f743b
退会済みユーザー

退会済みユーザー

2020/02/18 10:04

いろいろあると思いますが、前提として、はられたコードはコンパイルとおんないです。 並び替えまでできましたとありますが、コードのコピペ違いでしょうかね。
h_crane

2020/02/19 03:26

> 少し古いですが と記載したように、古いコードなので新しいswiftへの対応が必要です。 > はられたコードはコンパイルとおんないです。 マウントを取るわけではないですが、エラーコードを読んで検索すれば解決できることが多いので行いましょう。今後勉強する上で大切です! それは置いといて、解決策としては、新しくコメントされている方のコードを参照すると良いと思います。
退会済みユーザー

退会済みユーザー

2020/02/19 11:30 編集

h_craneさんへ、 はられたコードってのは、質問文のコードの方ですよ〜 コメント追加したのは、h_craneさんの貼ったリンク先の内容を参考にして該当箇所をなおしたとしても、 ビルドさえできないからです。 cellForRowAt内のlet cell = UITableVeiw(これ動くの?)とか、拡張してるviewControllerが違うとか、もろもろ 解決作としてtsukubadepotさんの回答を参考にしてってのは同意です。
退会済みユーザー

退会済みユーザー

2020/02/20 00:00

すみません cellForRowAt内のlet cell = UITableVeiwと拡張しているviewControllerが違うのは、自分のコピーミスです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問