今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") } } }
あなたの回答
tips
プレビュー