#コード
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に保存されたデータの削除の仕方がわからないです。
いろいろ試したんですが、今のコードだと削除ボタンをタップし、削除してもアプリを再起動すると削除したデータが復活してしまいます。お願いします。
あなたの回答
tips
プレビュー