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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

0回答

529閲覧

firestoreに保存されたデータを、削除ボタンタップ時に削除したい

ka.

総合スコア1

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/12/27 09:09

#コード
import UIKit
import Firebase

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, PostTableViewCellDelegate
{
let postTableViewCell = PostTableViewCell.self

@IBOutlet weak var tableView: UITableView! // 投稿データを格納する配列 var reportArray: [ReportData] = [] // Firestoreのリスナー var listener: ListenerRegistration! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self // カスタムセルを登録する let nib = UINib(nibName: "PostTableViewCell", bundle: nil) tableView.register(nib, forCellReuseIdentifier: "Cell") } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print("DEBUG_PRINT: viewWillAppear") if Auth.auth().currentUser != nil { // ログイン済み if listener == nil { // listener未登録なら、登録してスナップショットを受信する let reportsRef = Firestore.firestore().collection(Const.ReportPath).order(by: "date", descending: true) listener = reportsRef.addSnapshotListener() { (querySnapshot, error) in if let error = error { print("DEBUG_PRINT: snapshotの取得が失敗しました。 (error)") return } // 取得したdocumentをもとにreportDataを作成し、reportArrayの配列にする。 self.reportArray = querySnapshot!.documents.map { document in print("DEBUG_PRINT: document取得 (document.documentID)") let reportData = ReportData(document: document) return reportData } // TableViewの表示を更新する self.tableView.reloadData() } } } else { // ログイン未(またはログアウト済み) if listener != nil { // listener登録済みなら削除してreportArrayをクリアする listener.remove() listener = nil reportArray = [] tableView.reloadData() } } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return reportArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // セルを取得してデータを設定する let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PostTableViewCell //cellのdelegateにselfを渡す cell.deletedelegate = self //cellにIndex情報を渡す cell.index = indexPath cell.setReportData(reportArray[indexPath.row]) return cell }

}

//cellのデリゲートメソッドで削除処理を実装
extension HomeViewController {
func deleteButtonTapped(index: IndexPath){
// セル内のボタンがタップされた時に呼ばれるメソッド
//アラートを表示する↓===================
let alert: UIAlertController = UIAlertController(title: "注意", message: "削除してもいいですか?", preferredStyle: .actionSheet)
let canselAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .cancel) { (UIAlertAction) in
print("キャンセル")
}
let okAction: UIAlertAction = UIAlertAction(title: "削除", style: .destructive) { (UIAlertAction) in
// 「削除」が押された時の処理をここに記述
//削除するデータ

self.reportArray.remove(at: index.row) self.tableView.reloadData() } //アラートに設定を反映させる alert.addAction(okAction) alert.addAction(canselAction) //アラート画面を表示させる present(alert, animated: true, completion: nil) //アラートを表示する↑================== }

}
#ReportData(データを保存しているファイル)
import UIKit
import Firebase

class ReportData: NSObject {
var id: String
var name: String?
var caption: String?
var date: Date?
var language: String?
var hour: String?
var minute: String?

init(document: QueryDocumentSnapshot) { self.id = document.documentID let reportDic = document.data() self.name = reportDic["name"] as? String self.caption = reportDic["caption"] as? String let timestamp = reportDic["date"] as? Timestamp self.date = timestamp?.dateValue() self.hour = reportDic["hour"] as? String self.minute = reportDic["minute"] as? String self.language = reportDic["language"] as? String }

}

#やりたいこと
deleteButtonタップ時に、reportDataのデータを削除することで、
アプリを再起動した際にも削除したセルが表示されないようにしたい
#困っていること
firestoreに保存されたデータの削除の仕方がわからないです。
いろいろ試したんですが、今のコードだと削除ボタンをタップし、削除してもアプリを再起動すると削除したデータが復活してしまいます。お願いします。

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

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

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

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

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

hoshi-takanori

2020/12/27 10:03

FireStore のデータ本体はクラウドというか、Google が管理するサーバー上にあります。reportArray はそのコピーに過ぎないので、reportArray から削除してもクラウドにあるデータは消えず、アプリを再起動するとクラウドから再読み込みするため、データが復活してしまいます。クラウドのデータを消すには → https://firebase.google.com/docs/firestore/manage-data/delete-data
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問