2016-11-20 46 views
0

我有一個Instagram像一個一個一個地在每個單元格中顯示一個圖片的Feed。你可以按下它們並定向到commentTBV。這裏是我在帖子下面留下的所有評論,並且他們在此視圖中正確計數。顯示Feed中的評論數

var commentsArray = [FotoComment]() 

is the array holding the comments 

kommentarArray是我想用assignArray func填充的數組,因此我可以用它來顯示計數的數量。

var kommentarArray = [FotoComment]() 

[FotoComment]是我STRUC我用我的意見

我想的是,已經在飼料中commentArray.count將顯示評論數正確。

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

打印(kommentarArray.count) }

這樣,我從我的飼料在CommentTBVC意見數組訪問。

我的手機是:

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

但它始終顯示爲0,即使它已經有5篇評論,並在CommentTBV正確顯示。

M代表MemesTableViewConbtroller(進料)

import UIKit 

進口火力地堡 進口FirebaseAuth 進口FirebaseDatabase

類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 = FotoComment這是對這個TableView中已經工作數)

import UIKit 

進口火力地堡 進口FirebaseAuth 進口FirebaseDatabase 進口FirebaseStorage代碼

類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

+0

哪一個是你的主陣列?你有兩個數組,即'kommentarArray'和'commentsArray',你的函數似乎正在複製一個到下一個,因此你最終有兩個數組持有相同的數據。我的猜測是'commentsArray'是你的主要使用它的計數作爲你的單元格的文本,並擺脫'assignArray'函數 – eshirima

+0

我的主數組保存所有的評論是:var commentsArray = [FotoComment]()。 KommentarArray在feedTBV上,並且有一個地方我嘗試獲取計數。我嘗試在kommentarArray(新的)和commentsArray(持有正確數量的註釋的數據)中擁有相同的數據,但它只顯示0。 –

+0

這是你用來打印你的內容? – eshirima

回答

0

你要轉換您的數組數到字符串值在單元格中顯示。

試試這個代碼,

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

我希望這會爲你工作。

+0

不幸的是,它不適合我:/。這也是說init已經重新命名爲init(描述:)。我改變它仍然不起作用。 –

+0

你正在使用哪個swift版本? –

+0

我正在使用swift 3.0 –

0

因此,您有兩個單獨的視圖控制器,即CommentTableViewControllerMemesTableViewController,分別由commentsArraykommentarArray組成。這些數組具有類範圍的含義,即一旦你脫離了課堂;對於這種情況,它將離開視圖,然後它們將被釋放。一旦你進入視圖,他們將被重新創建並填充值。

由於您想獲得commentsArray中的元素數量,我建議您創建一個靜態變量,以便跟蹤這一點。當你做出靜態的東西時,你幾乎可以在整個應用程序/程序中訪問它,並且對它做出的更改反映在整個應用程序中。換句話說,一個內存塊被保留來存儲你的變量,這個變量只會在完全退出應用程序時纔會被取消分配。您可以將其視爲應用程序範圍變量。

兩種方式

  1. 糟糕的方式

    commentsArray定義更改從var commentsArray = [FotoComment]()static var commentsArray = [FotoComment]()。通過這樣做,你可以從任何其他類訪問和操作這個數組的內容。如果你有很少的元素,這很好,但是當你有幾萬甚至上百萬條評論時會發生什麼?這意味着即使我們真的不需要它,我們也會隨處散佈大量的數據。

  2. 推薦的方式

    保留目前commentsArray定義並添加此static var numberOfComments: Int = 0CommentTableViewController內。加入你的元素commentsArray後立刻更新元素跟蹤如下圖所示

    CommentTableViewController.numberOfComments = commentsArray.count 
    

然後,當你回到你MemesTableViewController,你可以簡單地刪除assignArray();因爲我們有一個全球性的要素計數,現在,只需修改你的這個

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

有了這個,就算你說的創建另一個類稱爲FriendsVC,您仍然可以訪問numberOfComments,甚至改變它。

PS:由於numberOfCommentsstatic,無論何時何地,你要訪問或修改它,你MUST總是先調用在它被定義的類或結構對於這種情況,它裏面CommentTableViewController如此。您需要始終使用CommentTableViewController.numberOfComments來訪問它;即使你在CommentTableViewController本身。永遠記住這一點。

+0

嘿感謝您的答案!它有點作品,這意味着它現在顯示的評論數量,但只有1張圖片(例如:3),然後顯示3條評論,當我按不同的一個(例如:1),並返回沒有任何變化,但如果我添加一條評論(現在2),那麼它顯示每個單元格的2條評論。我需要它在每個細胞上具體。 –

+0

當我在應用程序中輸入視圖時,它始終始於0的計數。只有在按下特定單元格後纔會發生更改 –

+0

@Zash__我真的不明白您的意思。您可以像gif那樣發佈可視化的問題?此外,如果我的答案解決了您的第一個問題,請投票並接受答案:) – eshirima