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

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

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

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

Swift

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

Q&A

0回答

244閲覧

削除機能を実装したいがどうすればいいかわからない

Moai101

総合スコア20

Firebase

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

Swift

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

0グッド

0クリップ

投稿2019/05/08 02:52

編集2019/05/08 04:15

今firebaseを使って簡単なチャットアプリを作っていて、スワイプ削除機能を実装したいと思っているのですがどのようにしたらいいかわかりません。 以下のコードの場合どのようなアプローチが取れるでしょうか?
下記のリンクの84行目と167行目あたりを参考にしてみたのですがそのまま取り込んでもUse of unresolved identifier 'messageDB'; did you mean 'Message'?というエラーメッセージが出てきます。
https://github.com/ShinokiRyosei/Firebase-Sampler/blob/3d86a0e959a062413bc13c04524da2b3996c3cd1/SampleFirebase/Controllers/ListViewController.swift

以下が私のコードです

// // ViewController.swift // Flash Chat // // Created by Angela Yu on 29/08/2015. // Copyright (c) 2015 London App Brewery. All rights reserved. // import UIKit import Firebase import ChameleonFramework class ChatViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { // Declare instance variables here var messageArray : [Message] = [Message]() // We've pre-linked the IBOutlets @IBOutlet var heightConstraint: NSLayoutConstraint! @IBOutlet var sendButton: UIButton! @IBOutlet var messageTextfield: UITextField! @IBOutlet var messageTableView: UITableView! var topButton = UIButton() override func viewDidLoad() { super.viewDidLoad() // identifierという言葉は画面遷移の時だけ messageTableView.delegate = self messageTableView.dataSource = self messageTableView.register(UINib(nibName: "MessageCell", bundle: nil) , forCellReuseIdentifier: "customMessageCell") messageTextfield.delegate = self // UIGestureRecognizer ではタップ、スワイプ(フリック)等々を扱えます let tapGesture = UITapGestureRecognizer(target: self, action: #selector (tableViewTapped)) messageTableView.addGestureRecognizer(tapGesture) configureTableView() observeMessages() messageTableView.separatorStyle = .none } //MARK: - TableView Delegate Methods func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "customMessageCell", for: indexPath) as! CustomMessageCell cell.messageBody.text = messageArray[indexPath.row].messageBody cell.senderUsername.text = messageArray[indexPath.row].sender cell.avatarImageView.image = UIImage(named: "egg") if cell.senderUsername.text == Auth.auth().currentUser?.email! { //Set background to blue if message is from logged in user. cell.avatarImageView.backgroundColor = UIColor.flatMint() cell.messageBackground.backgroundColor = UIColor.flatSkyBlue() } else { //Set background to grey if message is from another user. cell.avatarImageView.backgroundColor = UIColor.flatWatermelon() cell.messageBackground.backgroundColor = UIColor.flatGray() } return cell } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { //デリートボタンを追加 if editingStyle == .delete { //選択されたCellのIndexPathを渡し、データをFirebase上から削除するためのメソッド self.delete(at: indexPath) //TableView上から削除 messageTableView.deleteRows(at: [indexPath], with: .fade) } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return messageArray.count } @objc func tableViewTapped() { messageTextfield.endEditing(true) } //TODO: Declare configureTableView here: func configureTableView() { messageTableView.rowHeight = UITableView.automaticDimension messageTableView.estimatedRowHeight = 120.0 } //MARK: - TextField Delegate Methods func textFieldDidBeginEditing(_ textField: UITextField) { UIView.animate(withDuration: 0.5) { self.heightConstraint.constant = 308 self.view.layoutIfNeeded() } } func textFieldDidEndEditing(_ textField: UITextField) { UIView.animate(withDuration: 0.5) { self.heightConstraint.constant = 50 self.view.layoutIfNeeded() } } /////////////////////////////////////////// //MARK: - Send & Recieve Messages from Firebase // sendボタンを押したら実行されるので、これを参考に削除機能を書いていけば @IBAction func sendPressed(_ sender: AnyObject) { messageTextfield.endEditing(true) messageTextfield.isEnabled = false sendButton.isEnabled = false let messagesDB = Database.database().reference().child("Messages") let messageDictionary = ["Sender": Auth.auth().currentUser?.email, "MessageBody": messageTextfield.text!] messagesDB.childByAutoId().setValue(messageDictionary) { (error, reference) in if error != nil { print(error!) } else { print("Message saved successfully!") } self.messageTextfield.isEnabled = true self.sendButton.isEnabled = true self.messageTextfield.text = "" } } func delete(at indexPath: IndexPath) { messageDB.child((Auth.auth().currentUser?.uid)!).child(messageArray[indexPath.row].key).removeValue() messageArray.remove(at: indexPath.row) } func observeMessages() { let messageDB = Database.database().reference().child("Messages") messageDB.observe(.childAdded) { (snapshot) in let snapshotValue = snapshot.value as! Dictionary<String,String> let text = snapshotValue["MessageBody"]! let sender = snapshotValue["Sender"]! let message = Message() message.messageBody = text message.sender = sender self.messageArray.append(message) self.configureTableView() self.messageTableView.reloadData() } //// ここに追加かもしれない // https://qiita.com/nakadoribooks/items/9f566065e77ea585c4b2#%E6%88%90%E6%9E%9C%E7%89%A9 } //////////////////////////////////////////////// //MARK - Log Out Method @IBAction func logOutPressed(_ sender: AnyObject) { do { try Auth.auth().signOut() navigationController?.popToRootViewController(animated: true) } catch { print("error: there was a problem logging out") } } }

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

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

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

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

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

fuzzball

2019/05/08 03:59

「うまくいきませんでした」ではなく、状況を具体的に書いて下さい。
fuzzball

2019/05/08 04:30

エラーメッセージの意味は分かっているのでしょうか?
Moai101

2019/05/08 04:49

よく理解できていません エラーのところで messageという変数に変えるとValue of type 'Message' has no member 'key'というエラーが今度は出てきます。
fuzzball

2019/05/08 04:56 編集

messageDBが定義されていないってエラーです。(後半は、もしかしてMessageの間違いですか?って聞いてるだけなので、そういうわけでないなら無視して下さい) 英語が分からないなら(私も分かりません)、まず翻訳してみる。 それで意味が分からなくても、ググれば大抵のエラーは同様の質問記事か解説記事が出てきます。
Moai101

2019/05/08 05:13

おっしゃてくださったようにdelete(at indexPath: IndexPath) 内でlet messagesDB = Database.database().reference().child("Messages")と定義してもValue of type 'Message' has no member 'keyとでてきます
fuzzball

2019/05/08 05:29

また同じことを聞きますが、エラーメッセージの意味は分かっているのでしょうか?
Moai101

2019/05/08 21:55

すいません解決できました!
fuzzball

2019/05/09 00:09

解決できたのであれば、自分で回答を書き、自己解決でcloseして下さい。
fuzzball

2019/05/10 04:07

解決できたのであれば、自分で回答を書き、自己解決でcloseして下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問