【问题标题】:Swift3/Firebase Update childSwift3/Firebase 更新子
【发布时间】:2017-04-06 19:36:46
【问题描述】:

// 问题解决了 我自己找到了,仍然感谢您的帮助:=)

我尝试构建一个类似 Instagram 的应用程序以用于学习目的。 我可以从 Firebase 上传和检索数据。 当我上传一张新图片时,我将 cmets 的值设置为 0。 因此,当用户 cmets 时,我想更新子项的值(“kommentAnzahl”)+1 以获取新评论,减去 -1 以获取已删除评论(删除并不重要)。这样我就可以让我的标签 anzahlKommentare 在每个帖子下显示用户的 cmets 数量(就像 Instagram 一样)

我的完整代码在下面

class MemesTableViewController: UITableViewController {

var kommentarArray = [FotoComment]()
var dataBaseRef : FIRDatabaseReference!
var storageRef : FIRStorageReference!
var posts = [PostMitBild]()
var segmentedControl : HMSegmentedControl!

override func viewDidLoad() {
    super.viewDidLoad()

segmentedControl = HMSegmentedControl(sectionTitles: ["Top Heute", "Beliebteste", "Neue"])
  segmentedControl.frame = CGRect(x: 10, y: 10, width: 300, height: 60)
    segmentedControl.backgroundColor = UIColor.red
    segmentedControl.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    segmentedControl.borderColor = UIColor.brown
    segmentedControl.tintColor = UIColor.black
    segmentedControl.selectionIndicatorColor = UIColor.gray


    segmentedControl.addTarget(self, action: #selector(getter: MemesTableViewController.segmentedControl), for: UIControlEvents.valueChanged)
    tableView.tableHeaderView = segmentedControl

 segmentedAction()
}

func segmentedAction() {
    if segmentedControl.selectedSegmentIndex == 0 {

        let postRef = FIRDatabase.database().reference().child("MemesBilder")

        postRef.observe(.value, with: { (snapshot) in
            var newPost = [PostMitBild]()
            for post in snapshot.children {

                let Post = PostMitBild(snapshot: post as! FIRDataSnapshot)
                newPost.insert(Post, at: 0)

            }

            self.posts = newPost
            DispatchQueue.main.async {

                self.tableView.reloadData()


            }

            }, withCancel: { (error) in
                print(error.localizedDescription)
        })

    }

}

//------------------------------------------

override func viewWillAppear(_ animated: Bool) {

    if FIRAuth.auth()?.currentUser == nil {

        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Login")
        self.present(vc, animated: true, completion: nil)

    }

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell

    if let seconds = posts[indexPath.row].postDate {
         let timestamp = NSDate(timeIntervalSince1970: seconds)

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd/MM/yyyy  HH:mm"
        cell.uploadDatum.text = dateFormatter.string(from: timestamp as Date)

    }

        cell.kommentarZähler.text = String(posts[indexPath.row].kommentarAnzahl)
        cell.usernameTextField.text = posts[indexPath.row].username
        cell.postContent.text = posts[indexPath.row].content


        storageRef = FIRStorage.storage().reference(forURL: posts[indexPath.row].userImageUrlString)
        storageRef.data(withMaxSize: 1 * 1024 * 1024, completion: { (data, error) in
            if error == nil {
                DispatchQueue.main.async {
                    if let data = data {
                        cell.UserImageView.image = UIImage (data: data)
                    }
                }

            }else {
                print(error?.localizedDescription)
            }
        })

        let storageRef2 = FIRStorage.storage().reference(forURL: posts[indexPath.row].PostImageUrlString)
        storageRef2.data(withMaxSize: 1 * 1024 * 1024, completion: { (data, error) in
            if error == nil {
                DispatchQueue.main.async {
                    if let data = data {

                        cell.postImageView.image = UIImage (data: data)
                    }

                }
            }else {
                print(error?.localizedDescription)
            }
        })

        return cell

}

//done!!!! ------------------------------------------

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
      tableView.deleteRows(at: [indexPath], with: .fade)


        let ref = posts[indexPath.row].ref
        ref!.removeValue()

        posts.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)

    }
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var numberOfRows = 0
    switch segmentedControl.selectedSegmentIndex {
    case 0 :  numberOfRows = posts.count

    case 1: numberOfRows = posts.count

    default: break


    }

    return numberOfRows
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 420.00
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segmentedControl.selectedSegmentIndex == 0 {
        if segue.identifier == "addComment" {
            let vc = segue.destination as! CommentTableViewController
            let indexPath = tableView.indexPathForSelectedRow!

            vc.selectedPosts = posts[indexPath.row]
        }

    }
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if segmentedControl.selectedSegmentIndex == 0 {
        performSegue(withIdentifier: "addComment", sender: self)
    }
    if segmentedControl.selectedSegmentIndex == 1 {
        performSegue(withIdentifier: "addComment", sender: self)
    }
    if segmentedControl.selectedSegmentIndex == 2 {
        performSegue(withIdentifier: "addComment", sender: self)
    }
}

}



import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage

class CommentTableViewController: UITableViewController {

    @IBOutlet weak var komentarZähler: UILabel!
    @IBOutlet weak var UserImageView: UIImageView!
    @IBOutlet weak var usernameTextField: UILabel!
    @IBOutlet weak var postImageView: UIImageView!
    @IBOutlet weak var postContent: UITextView!

    var dataBaseRef : FIRDatabaseReference!
    var storageRef : FIRStorageReference!
    var commentsArray = [FotoComment]()
    var selectedPosts:PostMitBild!
    var DataBaseRef : FIRDatabaseReference! {
    return FIRDatabase.database().reference()
    }

    override func viewDidLoad() {
    super.viewDidLoad()
    configurePost()

    let commentRef = selectedPosts.ref!.child("Kommentare")

    commentRef.observe(.value, with: { (snapshot) in
        var newComments = [FotoComment]()
        for item in snapshot.children {
            let neuerKommentar = FotoComment(snapshot: item as! FIRDataSnapshot)
            newComments.insert(neuerKommentar, at: 0)

        }
        self.commentsArray = newComments
        self.tableView.reloadData()

        }, withCancel: { (error) in
            print(error.localizedDescription)
    })

    }
    @IBAction func addComment(_ sender: UIBarButtonItem) {

    let alertView = UIAlertController(title: "Kommentar", message: "Füge einen Kommentar hinzu", preferredStyle: UIAlertControllerStyle.alert)
    alertView.addTextField { (textfield) in
        textfield.placeholder = "Einen neuen Kommentar hinzufügen"

    }

    let sendCommentAction = UIAlertAction(title: "Kommentieren", style: .default) { (action) in
        let textfield = alertView.textFields!.first!

        let comment = FotoComment(content: textfield.text! , postId: self.selectedPosts.postId , username: (FIRAuth.auth()!.currentUser!.displayName!) , userImageUrlString: String(describing: FIRAuth.auth()!.currentUser!.photoURL!), postDate: (NSDate().timeIntervalSince1970))

        let commentRef = self.selectedPosts.ref!.child("Kommentare").childByAutoId()

        let myReference = FIRDatabase.database().reference()
      myReference.child("MemesBilder").child("kommentarAnzahl").setValue(["kommentarAnzahl": 1])

        commentRef.setValue(comment.toAnyObject())

        // commentRef.child("kommentarAnzahl").updateChildValues(["kommentarAnzahl" : 1])

    }

    let cancelAction = UIAlertAction(title: "Abbrechen", style: .cancel, handler: nil)
    alertView.addAction(sendCommentAction)
    alertView.addAction(cancelAction)
    self.present(alertView, animated: true, completion: nil)

    }

    // 2----------------------------------------------

    func configurePost() {

    usernameTextField.text = selectedPosts.username
    postContent.text = selectedPosts.content


    storageRef = FIRStorage.storage().reference(forURL: selectedPosts.userImageUrlString)
    storageRef.data(withMaxSize: 1 * 1024 * 1024, completion: { (data, error) in
        if error == nil {
            DispatchQueue.main.async {
                if let data = data {
                    self.UserImageView.image = UIImage (data: data)
                }
            }

        }else {
            print(error?.localizedDescription)
        }
    })
    let storageRef2 = FIRStorage.storage().reference(forURL: selectedPosts.PostImageUrlString)
    storageRef2.data(withMaxSize: 1 * 1024 * 1024, completion: { (data, error) in
        if error == nil {
            DispatchQueue.main.async {
                if let data = data {

                    self.postImageView.image = UIImage (data: data)
                }

            }
        }else {
            print(error?.localizedDescription)
        }
    })

    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      komentarZähler.text = "Kommentare: \(commentsArray.count)"

    return commentsArray.count

    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "commentCell", for: indexPath) as! CommentTableViewCell

    if let seconds = commentsArray[indexPath.row].postDate {
        let timestamp = NSDate(timeIntervalSince1970: seconds)

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd/MM/yyyy  HH:mm:ss"
        cell.uploadDatum.text = dateFormatter.string(from: timestamp as Date)

    }

    cell.usernameTextField.text = commentsArray[indexPath.row].username
    cell.postContent.text = commentsArray[indexPath.row].content

    storageRef = FIRStorage.storage().reference(forURL: commentsArray[indexPath.row].userImageUrlString!)
    storageRef.data(withMaxSize: 1 * 1024 * 1024, completion: { (data, error) in
        if error == nil {
            DispatchQueue.main.async {
                if let data = data {
                    cell.UserImageView.image = UIImage (data: data)
                }
                self.tableView.reloadData()
            }


        }else {
            print(error?.localizedDescription)
        }

    })
  return cell
}

}

import UIKit
import Firebase
import FirebaseStorage
import FirebaseAuth
import FirebaseDatabase

class AddImageViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPickerViewDelegate {

    @IBOutlet weak var postImage: UIImageView!

    @IBOutlet weak var textView: UITextView!

    var dataBaseRef : FIRDatabaseReference! {
    return FIRDatabase.database().reference()
    }

    var storageRef : FIRStorageReference! {
    return FIRStorage.storage().reference()
    }

    override func viewDidLoad() {
    super.viewDidLoad()

    }

    @IBAction func chooseImage(_ sender: UIButton) {
    let pickerController = UIImagePickerController()
    pickerController.delegate = self
    pickerController.allowsEditing = true

    let alertController = UIAlertController(title: "Bild aussuchen", message: "Suche dir dein neues Profilbild aus", preferredStyle: .actionSheet)

    let cameraAction = UIAlertAction(title: "Kamera", style: .default, handler: { (action) in
        pickerController.sourceType = .camera
        self.present(pickerController, animated: true, completion: nil)
    })
    let photoLibraryAction = UIAlertAction(title: "Fotoalbum", style: .default, handler: { (action) in
        pickerController.sourceType = .photoLibrary
        self.present(pickerController, animated: true, completion: nil)

    })
    let safedPhotoAction = UIAlertAction(title: "Fotos", style: .default, handler: { (action) in
        pickerController.sourceType = .savedPhotosAlbum
        self.present(pickerController, animated: true, completion: nil)

    })

    let cancelAction = UIAlertAction(title: "Abbrechen", style: .destructive, handler: nil)
    alertController.addAction(cameraAction)
    alertController.addAction(photoLibraryAction)
    alertController.addAction(safedPhotoAction)
    alertController.addAction(cancelAction)

    present(alertController, animated: true, completion: nil)

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage
    self.postImage.image = image

    self.dismiss(animated: true, completion: nil)
    }

    @IBAction func SafeAction(_ sender: UIBarButtonItem) {
    let data = UIImageJPEGRepresentation(self.postImage.image!, 0.5)
    let metadata = FIRStorageMetadata()
    metadata.contentType = "image/jpeg"
    let postId = "\(FIRAuth.auth()!.currentUser!.uid)\(NSUUID().uuidString)"
    let imagePath = "postIMAGES\(postId)/postPic.jpg"

    storageRef.child(imagePath).put(data!, metadata: metadata) { (metadata, error) in
        if error == nil {

            let postRef = self.dataBaseRef.child("MemesBilder").childByAutoId()
            let post = PostMitBild(content: self.textView.text!, postId: postId, username: (FIRAuth.auth()?.currentUser?.displayName!)!, PostImageUrlString: String(describing: metadata!.downloadURL()!), userImageUrlString: String(describing: FIRAuth.auth()!.currentUser!.photoURL!), postDate: (NSDate().timeIntervalSince1970), kommentarAnzahl: 0)

                postRef.setValue(post.toAnyObject())


            let vc =  UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Memes")
            self.present(vc, animated: true, completion: nil)


        }else {
            print(error!.localizedDescription)
        }
    }
       _ = navigationController?.popToRootViewController(animated: true)
    }

}

这些是我的 3 个 VC,用于显示图片(MemesTableView)、添加图片(AddImageView)和评论上传的图片(CommentTableView)

在我的 Firebase 结构的下方

这就是我的结构的样子

我想在每次用户 cmets 时将 func "addComment" 中的投票数更新为 1

This is my JSON Tree in written format

【问题讨论】:

  • 您在问题中包含了 JSON 树的照片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • witzeapp-4ec48.firebaseio.com 是你的意思吗? :O 对不起,我是一个绝对的初学者。
  • 好吧,我 nils 已经用我的 JSON 树的图片以书面格式更新了它。希望对您有所帮助。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:
  • 我已经给出了一个示例函数,用于更新 firebase 中的投票计数值。试试下面的

    func adddComment() {
      dataBaseRef.child("MemesBilder").child(userId).child("anzahlKommentare").runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in
        var voteCount = currentData.value as? Double
        if (voteCount == nil) {
            voteCount = 0
        }
        currentData.value = voteCount! + 1
        return FIRTransactionResult.successWithValue(currentData)
    }) 
    }
    

【讨论】:

  • 好的,到目前为止谢谢你 :) 但是我必须交换部分“.child(userID)”吗?如果尝试这样做,它总是会创建一个新路径并且不会更新现有路径:/
  • 我认为我必须以某种方式获取帖子的随机分配 ID,因为我通过 childbyAutoId 创建了所有帖子,并且他们像 "-KXH03xSgZdIvcCOzbfS" 一样获得它们。所以第二个孩子“.child(userID)”必须访问评论帖子的随机分配的代码(帖子的特定键)并更新该帖子中“kommentarAzahl”的值,对吧?
  • 是的,你是对的,你需要按照你在第二条评论中提到的方式执行。
  • 问题是如何获得我正在评论的帖子的特定分配 ID?这是我最大的担忧。
  • 您必须获取已评论的图像的参考。使用该参考,您可以获得他的用户 ID。
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多