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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

TableView

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

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

2回答

2725閲覧

選択されたtableViewCellに表示されているfirestoreデータのdocumentIDを取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

TableView

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

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クリップ

投稿2019/07/29 06:13

編集2019/07/30 07:40

知りたいこと

選択されたtableViewCellに表示されているfirestoreデータのdocumentIDを取得する方法を知りたいです。

やろうとしていることの全体像

選択したtableViewcellを"delete"ボタンをタップして削除したいので、

"delete"ボタンをタップ
→ 選択しているセルのindexPathを取得
→ 取得したindexPathに格納しているfirebaseのfirestoreデータを削除
→ tableViewをリロード

という流れで行おうと考えております。

現状

「取得したindexPathに格納しているfirebaseのfirestoreデータを削除」の段階のデータを削除する時に、documentIDを指定しなければならないようで ( https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja )、そのIDの取得方法がわからず詰まっています。

swift

1@IBAction func tapDeleteButton(_ sender: Any) { //check mark がついているセルを削除 2 3 //選択されているセルのindexPath.rowを取得 4 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 5 let selectedCell = tableView.cellForRow(at: indexPath) 6 7 // (削除する)選択されたセルに入っているdraftDataのdocumentIDを取得 8 let documents = documentsnapshot.documents //ここでエラー 9 for i in 0 ..< documents.count { 10 let dictData = documents[i].data() 11 let documentID = documents[i].documentID 12 print("Document ID (documentID)") 13 } 14 15 // forestoreの方のデータを削除 ("DC"は公式のをコピペしたままのものです。) 16 db.collection("drafts").document("DC").delete() { err in 17 if let err = err { 18 print("Error removing document: (err)") 19 } else { 20 print("Document successfully removed!") 21 } 22 } 23 } 24 // tableview(draftData)をリロード 25 self.tableView.reloadData() 26 }

エラーコード

Use of unresolved identifier 'documentsnapshot'; did you mean 'DocumentSnapshot'?

documentIDは、自動生成の.addメソッドを使用しています。
https://firebase.google.com/docs/firestore/manage-data/add-data

データの取得は、tableViewCellに表示させる前にtimestampで上から新着順に表示するようにしています。

swift

1func getDraftsData() { 2 guard let uid = user?.uid else { return } 3 db.collection("drafts").whereField("uid", isEqualTo: uid).getDocuments() { (querysnapshot, err) in 4 if let err = err { 5 print("error getting documents: (err)") 6 } else { 7 let personalDraftData = querysnapshot!.documents.sorted {personalDraftData,provisionalDraftData in 8 guard let personalDraftsData = personalDraftData.data()["timestamp"] as? Timestamp, 9 let provisionalDraftsData = provisionalDraftData.data()["timestamp"] as? Timestamp else { return false } 10 return (personalDraftsData.dateValue() > provisionalDraftsData.dateValue()) 11 } 12 self.draftData = personalDraftData 13 self.tableView.reloadData() 14 } 15 } 16 }

どのようにしたらdocumentIDを取得できるか教えていただきたいです。
よろしくお願いします。

補足

ご回答いただきました内容にコードを書き換えて実行した結果です。
設定したブレイクポイントではブレイクしてくれず、ボタンアクションが完了した最後の "}" でブレイクされます。
また、シミュレータの動きとしては、delete ボタンタップ後は選択されていたセルのチェックマークが外れるだけで、firestoreのコンソール内のデータを確認しても削除されておりません。
イメージ説明

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

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

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

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

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

takabosoft

2019/07/29 07:20 編集

> db.collection("drafts").document("DC").delete() で言うところの"DC"を、cellが指し示す何かしらの文字列に変えたいという質問ですよね? たぶんcellを作っているときはdrafts[indexPath.row]にアクセスして構築しているんだと思いますが、 drafts[indexPath.row]の中にそれらしきドキュメント名は入っていないのでしょうか?
退会済みユーザー

退会済みユーザー

2019/07/30 00:20

>"DC"を、cellが指し示す何かしらの文字列に変えたいという質問ですよね? そうです! >たぶんcellを作っているときはdrafts[indexPath.row]にアクセスして構築しているんだと思いますが、 drafts[indexPath.row]の中にそれらしきドキュメント名は入っていないのでしょうか? 申し訳ありません、どのメソッドをみたらわかるでしょうか??orz
guest

回答2

0

Swift

1//選択されたindexPathの配列 2var selectedIndexPaths: [IndexPath] = [ 3@IBAction func tapDeleteButton(_ sender: Any) { //check mark がついているセルを削除 4 5 //選択されているセルのindexPath.rowを取得 6 7 for indexPath in selectedIndexPaths{ 8 9 let dictData = draftData[indexPath.row].data() 10 let documentID = draftData[indexPath.row].documentID 11 print("Document ID (documentID)") 12 13 db.collection("drafts").document(documentID).delete() { err in 14 if let err = err { 15 print("Error removing document: (err)") 16 } else { 17 print("Document successfully removed!") 18 self.tableView.reloadData() 19 } 20 } 21 } 22 } 23 24 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 25 let selectedCell = tableView.cellForRow(at: indexPath) 26 27 28 //タップされた時の処理 29       if selectedIndexPaths.contains(indexPath){ 30 for (i, ip) in slectedIndexPaths.enumerated(){ 31 if ip == indexPath{ 32 selectedCell.backgroundColor = .clear 33 selectedIndexPaths.remove(at: i) 34 break 35 } 36 } 37 }else{ 38 selectedIndexPaths.append(indexPath) 39 //セルが選択されていることを示す何らかの処理, 例えば赤くするとか 40 selectedCell.backgroundColor = .red 41 } 42 43 tableView.reloadData() 44 45 46 47 }

投稿2019/07/30 02:20

fathy

総合スコア254

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

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

退会済みユーザー

退会済みユーザー

2019/07/30 03:03 編集

ありがとうございます。 試してみます!
退会済みユーザー

退会済みユーザー

2019/07/30 03:07

すみません。やっぱり中が走らないです。。
fathy

2019/07/30 03:15

もう少し具体的に教えてください。 あとコードの画面のスクリーンショットを送ってください
退会済みユーザー

退会済みユーザー

2019/07/30 04:52

すみません、スクリーンショットをこの回答に貼り付ける方法がわからないのですが、どこに貼ったらよろしいでしょうか? >中が走らない とは、 @IBAction { } が走っていない、と言うことでして db.collection("drafts").document(documentID).delete() { err in の行と if selectedIndexPaths.contains(indexPath){ の行にブレイクポイントを設定して行いました。
fathy

2019/07/30 07:07

質問を編集して追記してください。 cellを選択していることは確認できていますか? タップした時に赤くなりますか?
退会済みユーザー

退会済みユーザー

2019/07/30 07:42 編集

かしこまりました。少々お待ちくださいませ。 先にご質問の回答をさせていただきます。 >cellを選択していることは確認できていますか? はい、できております。 >タップした時に赤くなりますか? 下記のエラーが出ていたのと、私のアプリでは色を変えることはしない(デフォルトでグレーになっている)ためコメントアウトして実行しておりました orz 申し訳ありません。必要であればエラーを直してからもう一度試します。 Value of optional type 'UITableViewCell?' must be unwrapped to refer to member 'backgroundColor' of wrapped base type 'UITableViewCell'
fathy

2019/07/30 08:28

スクリーンショット拝見致しました。 @IBAction func tap〜の中から, func tableView(_ tableView: UITableView〜を取り出してください。 関数内で関数を定義している状態になっているため, tableView(tableView:didTap:indexPath)関数が呼ばれていません。 回答内容をよく見て修正してください。
退会済みユーザー

退会済みユーザー

2019/07/30 23:33

大変申し訳ありません、ご指摘ありがとうございますorz @IBAction の関数内から取り出して修正してビルド致しました。 現在、すでに別箇所に func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) メソッドが存在していて、そのメソッド内に書いていたメソッド ( checkMark(checkMarkStatus: true) のみ )と合わせてビルドしたところ、 "check all" と "unselect all" での選択は可能なのですが、1つ1つ選択をする動きがおかしくなったので、修正を試みております。 ご回答、誠にありがとうございます!!!
fathy

2019/07/31 06:08

よかったです。 よろしければ解決済にしてください。
退会済みユーザー

退会済みユーザー

2019/08/02 06:50

すみません、まだ解決できていないので解決しましたらそのようにするつもりです。。。
guest

0

Swift

1let documents = documentsnapshot.documents //ここでエラー 2 for i in 0 ..< documents.count { 3 let dictData = documents[i].data() 4 let documentID = documents[i].documentID 5 print("Document ID (documentID)") 6 } 7// forestoreの方のデータを削除 ("DC"は公式のをコピペしたままのものです。) 8 db.collection("drafts").document("DC").delete() { err in 9 if let err = err { 10 print("Error removing document: (err)") 11 } else { 12 print("Document successfully removed!") 13 } 14 }

の部分を

Swift

1 var deleteID = "" 2 for i in 0 ..< draftData.count { 3 let dictData = documents[i].data() 4 let documentID = documents[i].documentID 5 print("Document ID (documentID)") 6 7 //section は一つと仮定しています。 8 if i == indexPath.row{ 9 deleteID = documentID 10 break 11 } 12 } 13 14 15 db.collection("drafts").document(deleteID).delete() { err in 16 if let err = err { 17 print("Error removing document: (err)") 18 } else { 19 print("Document successfully removed!") 20 self.tableView.reloadData() 21 } 22 }

やっていることは,そのセルのindexPathから表示されているセルのdocumentを取得しています。

投稿2019/07/29 09:36

fathy

総合スコア254

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

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

退会済みユーザー

退会済みユーザー

2019/07/30 01:00

ご回答ありがとうございます。ご回答くださった方法で試してみたところ、 let dictData = documents[i].data() let documentID = documents[i].documentID の documents のところでエラーがでました↓ Use of unresolved identifier 'documents'; did you mean 'UIDocument'? ので、documents→draftData に変更して実装したところ、 全てのドキュメントidとデータを全取得してきます。そしてデータは削除されませんでした。
fathy

2019/07/30 01:05

すみません。間違えました。 documentsを全てdraftDataに置き換えてください。
fathy

2019/07/30 01:06

あごめんなさい。やったんですね。
fathy

2019/07/30 01:12

var deleteID = "" for i in 0 ..< draftData.count { let dictData = draftData[i].data() let documentID = draftData[i].documentID print("Document ID (documentID)") //section は一つと仮定しています。 if i == indexPath.row{ deleteID = documentID       print("deleteID: (deleteID)") print("indexPath: (indexPath)") break } } などとしてifの部分が通っているか確かめていただけますか?
退会済みユーザー

退会済みユーザー

2019/07/30 02:09 編集

先ほどご報告していなかったのですが、まずif文の行にブレイクポイントを設定していまいたがその場所では停止せず、でした。また、if文内に print("@@@@@@@(deleteID)") (@は私が見やすいようにです)を書いていましたが通っていなかったです。
退会済みユーザー

退会済みユーザー

2019/07/30 01:40

ちなみに停止したのは self.tableView.reloadData() の文でした。
fathy

2019/07/30 01:50

すみません。 質問文の最初のコードに関数の定義位置の問題に気づいていませんでした。 修正点を改めて回答させて頂きたいのですが,1点確認したいのが,選択したあとdeletebutton を押したタイミングで削除を実行するのか,deletebuttonを押したあとでcell選択時に削除を実行するのかどちらでしょうか。
退会済みユーザー

退会済みユーザー

2019/07/30 02:04 編集

こちらこそ申し訳ありません。 おそらく前者の「選択したあとdeletebutton を押したタイミングで削除を実行する」だと思います(後者のほうがよく理解できませんでした。) 選択するのはedit ボタンを編集モードにしてから行います。 選択のところのコードを補足として記載させていただきますm(_ _ )m
退会済みユーザー

退会済みユーザー

2019/07/30 02:05

補足です。 編集モードでセルを選択して、削除ボタンで削除を実行したいです。 (同じ編集モードで、ボタンタップで一括選択・一括選択解除もできるようにしています) ``` override func viewDidLoad() { super.viewDidLoad() //複数選択できるようにする tableView.allowsMultipleSelectionDuringEditing = true } ``` ``` @IBAction func tapCloseButton(_ sender: Any) { if closeButton.image == nil && closeButton.title == "Check all" { for row in 0..<draftData.count { let indexPath = IndexPath(row: row, section: 0) tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none) checkMark(checkMarkStatus: true) print(indexPath) } } else if closeButton.image == nil && closeButton.title == "Unselect all" { for row in 0..<draftData.count { let indexPath = IndexPath(row: row, section: 0) tableView.deselectRow(at: indexPath, animated: true) checkMark(checkMarkStatus: true) } } else { self.dismiss(animated: true, completion: nil) } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問