显示Feed中的评论数

时间:2016-11-20 22:37:41

标签: ios arrays swift cell

我有一个类似于Instagram的Feed,每个单元格中一次显示一张图片。您可以按下它们并转到commentTBV。这是我在帖子下面的所有评论的地方,他们在这个视图中被正确计算。

var commentsArray = [FotoComment]()

is the array holding the comments

kommentarArray是我想用assignArray函数填充的数组,所以我可以用它来显示计数量。

var kommentarArray = [FotoComment]()

[FotoComment]是我用来评论的结构

我想要的是,commentArray.count已经在Feed中显示正确的评论数量。

func assignArray() {
    let otherVC = CommentTableViewController()
    kommentarArray = otherVC.commentsArray

打印(kommentarArray.count)     }

通过这种方式,我可以从我的Feed访问CommentTBVC中的评论数组。

我的手机是:

cell.kommentarZähler.text = "Kommentare: \(kommentarArray.count)"

但它总是显示0,即使它已经有5条评论并且它正确地显示在CommentTBV上。

MemesTableViewConbtroller的完整代码(供稿)

import UIKit

导入Firebase 导入FirebaseAuth 导入FirebaseDatabase

class MemesTableViewController:UITableViewController {

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





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


 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 = "Kommentare: \(kommentarArray.count)"
        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)
    }
}

func assignArray() {

    let otherVC = CommentTableViewController()
    kommentarArray = otherVC.commentsArray

    print(kommentarArray.count)
}

}

CommentTableViewController的代码(我想从数组中获取注释的数量var commentsArray =已经在这个TableView上工作的FotoComment)

import UIKit

导入Firebase 导入FirebaseAuth 导入FirebaseDatabase 导入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!



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()
        commentRef.setValue(comment.toAnyObject())
    }


    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)
        }



    })

返回细胞 }

}

this is how i safe my data in firebase. I want to update the number of comments (kommentarAnzahl which is currently 0) every time a comment is added to the post

2 个答案:

答案 0 :(得分:0)

您必须将数组计数转换为字符串值才能在单元格中显示。

试试此代码,

cell.kommentarZähler.text = String("Kommentare:",kommentarArray.count)

我希望这对你有用。

答案 1 :(得分:0)

因此,您有两个独立的视图控制器,即CommentTableViewControllerMemesTableViewController,分别由commentsArraykommentarArray组成。这些数组属于类范围,这意味着一旦你进入课堂之外;对于这种情况,它将离开视图,然后它们将被取消分配。进入视图后,它们将再次重新创建并填充值。

由于您希望获得commentsArray中的元素数量,我建议您创建一个静态变量来跟踪此变量。当您制作静态内容时,您几乎可以在整个应用/程序中访问它,并且对其进行的更改会反映在整个应用中。换句话说,保留一个内存块来存储您的变量,只有在您完全退出应用程序后才会取消分配。您可以将此视为应用范围变量。

两种方式

  1. 糟糕的方式

    commentsArray定义从var commentsArray = [FotoComment]()更改为static var commentsArray = [FotoComment]()。通过这样做,您可以从任何其他类访问和操作此数组的内容。如果您的元素很少,那么这很好,但是当您有数万甚至一百万条评论时会发生什么?它意味着即使我们真的不需要,我们也会随处走动,提供大量数据。

  2. 推荐方式

    保留当前的commentsArray定义,并在static var numberOfComments: Int = 0内添加此CommentTableViewController。将元素添加到commentsArray后,立即更新元素跟踪器

    CommentTableViewController.numberOfComments = commentsArray.count
    
  3. 然后当您返回MemesTableViewController时,您只需删除assignArray();因为我们现在有一个全局元素计数器,只需将你的单元格修改为

    cell.kommentarZähler.text = String(CommentTableViewController.numberOfComments)
    

    有了这个,即使您创建另一个名为FriendsVC的课程,您仍然可以访问numberOfComments甚至更改它。

    PS:由于numberOfCommentsstatic,无论何时何地您想要访问或修改它,必须始终首先调用其中的类或结构它被定义为。在这种情况下,它位于CommentTableViewController内,因此您需要始终CommentTableViewController.numberOfComments来访问它;即使你在CommentTableViewController内。永远记住这一点。