2016-11-22 6 views
0

// 문제는 자신에 의해 당신의 도움에 여전히 감사를 발견 해결했다. Firebase에서 데이터를 업로드하고 검색 할 수 있습니다. 새 그림을 업로드 할 때 주석 값을 0으로 설정합니다. 사용자가 주석을 달았을 때 새 주석에 대해서는 +1 ("kommentAnzahl") +1을, 하나는 삭제되었습니다 (삭제는 아직 중요하지 않습니다). 내 라벨 anzahlKommentare이 (인스 타 그램이하는 것처럼) 각 게시물 아래에 사용자 의견의 양을 표시 할 수 할 수 있도록Swift3/중포 기지 업데이트 자녀

내 전체 코드는 이들의 표시 제 3 VC입니다 아래

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

} 

다음과 같습니다 업로드 된 사진 (CommentTableView) 사진 (AddImageView)를 추가하고 주석에 대한 사진 (MemesTableView), 아래로 내 중포 기지 구조가

이 내 구조체모습입니다처럼 보이는 방법을 아래에

17,451,515,this is what my struct looks like

내가 업데이트를위한 샘플 기능을 준

This is my JSON Tree in written format

+0

completer을 찾을 수 있습니다보십시오. 실제 JSON을 텍스트로 바꾸십시오. Firebase 데이터베이스 콘솔에서 내보내기 버튼을 클릭하면 쉽게 얻을 수 있습니다. JSON을 텍스트로 사용하면 검색이 가능해 지므로 실제 데이터로 테스트하고이를 사용하여 쉽게 답변 할 수 있습니다. 일반적으로 할 일은 단지 좋은 일입니다. –

+0

https://witzeapp-4ec48.firebaseio.com/ 그게 무슨 뜻입니까? : 미안해. 나는 초보자 야. –

+0

OKAy iils은 JSON 트리 그림을 서면 형식으로 업데이트했습니다. 희망이 도움이됩니다. –

답변

0
  • 나는 사용자가 코멘트 (1)의 값마다 FUNC "addComment"의 투표 수를 업데이트 할 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) 
    }) 
    } 
    
+0

지금까지 고맙습니다. :)하지만 ".child (userID)"부분을 교환해야합니까? 그리고 이것을 시도하면 항상 새로운 경로가 생성되고 기존 경로는 업데이트되지 않습니다./ –

+0

나는 모든 게시물을 childbyAutoId로 작성하고 그 (것)들을 좋아하기 때문에 나는 무작위로 할당 된 ID를 가져야한다고 생각합니다. "- KXH03xSgZdIvcCOzbfS ". 두 번째 자식 ".child (userID)"는 주석이 달린 게시물의 임의로 할당 된 코드 (게시물의 특정 키)에 액세스하고이 게시물 내의 "kommentarAzahl"값을 업데이트해야합니다. –

+0

네, 맞습니다. 그리고 두 번째 주석에서 언급 한대로 그런 식으로 수행해야합니다. –

관련 문제