2017-12-19 7 views
1

프로토 타입 셀을 표시하지 않는 tableview에 문제가 있습니다. 각 셀과 식별자의 이름을 올바르게 지정했습니다. 현재 코드는 다음과 같습니다. (감사합니다.)테이블 뷰에서 firebase 사용자가 표시되지 않습니다

import UIKit 
import Firebase 
import FirebaseDatabase 
class UsersTableViewController: UITableViewController { 



@IBOutlet var tableview: UITableView! 

var ref: DatabaseReference! 

var user = [User]() 


override func viewDidLoad() { 
    super.viewDidLoad() 
    getusers() 
    // Do any additional setup after loading the view. 
} 

func getusers() { 
    let ref = Database.database().reference() 

    ref.child("users").child(Auth.auth().currentUser!.uid).queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in 

     let users = snapshot.value as? [String : AnyObject] ?? [:] 

     for (_, value) in users 
     { 
      if let uid = users["uid"] as? String 
      { 
       if uid != Auth.auth().currentUser!.uid 
       { 
        let showUser = User() 

        if let fullname = users["fullname"] as? String, let imagePath = users["urlImage"] as? String 
        { 
         showUser.fullname = fullname 
         showUser.imagePath = imagePath 
         showUser.userID = uid 
         self.user.append(showUser) 
        } 

       } 


      } 

     } 
     self.tableview.reloadData() 
    }) 

    ref.removeAllObservers() 
} 

override func numberOfSections(in tableview: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableview: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! UserCell 

    cell.nameLabel.text = self.user[indexPath.row].fullname 
    cell.UserID = self.user[indexPath.row].userID 
    cell.userImage.downloadImage(from: self.user[indexPath.row].imagePath!) 
    checkFollowing(indexPath: indexPath) 

    return cell 
} 

override func tableView(_ tableview: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return user.count 
} 


override func tableView(_ tableview: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let uid = Auth.auth().currentUser!.uid 
    let ref = Database.database().reference() 
    let key = ref.child("users").childByAutoId().key 

    var isFollower = false 

    ref.child("users").child(uid).child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in 

     if let following = snapshot.value as? [String : AnyObject] { 
      for (ke, value) in following { 
       if value as! String == self.user[indexPath.row].userID { 
        isFollower = true 

        ref.child("users").child(uid).child("following/\(ke)").removeValue() 
        ref.child("users").child(self.user[indexPath.row].userID).child("followers/\(ke)").removeValue() 

        self.tableview.cellForRow(at: indexPath)?.accessoryType = .none 
       } 
      } 
     } 
     if !isFollower { 
      let following = ["following/\(key)" : self.user[indexPath.row].userID] 
      let followers = ["followers/\(key)" : uid] 

      ref.child("users").child(uid).updateChildValues(following) 
      ref.child("users").child(self.user[indexPath.row].userID).updateChildValues(followers) 

      self.tableview.cellForRow(at: indexPath)?.accessoryType = .checkmark 
     } 
    }) 
    ref.removeAllObservers() 

} 


func checkFollowing(indexPath: IndexPath) { 
    let uid = Auth.auth().currentUser!.uid 
    let ref = Database.database().reference() 

    ref.child("users").child(uid).child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in 

     if let following = snapshot.value as? [String : AnyObject] { 
      for (_, value) in following { 
       if value as! String == self.user[indexPath.row].userID { 
        self.tableview.cellForRow(at: indexPath)?.accessoryType = .checkmark 
       } 
      } 
     } 
    }) 
    ref.removeAllObservers() 

} 



override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
// Get the new view controller using segue.destinationViewController. 
// Pass the selected object to the new view controller. 
} 
*/ 

} 

현재 사용자 저장을 위해 Google의 Firebase API를 사용하고 있습니다. 이 코드에서는 사용자를 내 tableview로 가져 오려고합니다. 내 테이블보기 만 정보를 표시하지 않습니다. 도움을 주실 수 있다면 미리 감사드립니다!

+0

이'self.user.append (showUser)'는 언제든지 호출됩니까? 확인해 봤어? – Oxthor

+0

@Oxthor 안녕하세요. 나는 새로운 것을 빨리하고, 나는 그 질문을 완전히 이해하지 못한다. 그러나 user.count를 사용하여 행을 추가해야하는 사용자 배열에 내 사용자 정보를 추가한다는 것을 알고 있습니다. –

답변

0

ref.removeAllObservers() 행을 제거하십시오. 메소드 observeSingleEvent는 완료 실행 후 옵저버를 자동으로 제거합니다. 따라서 귀하의 경우 ref.removeAllObservers()는 완료 호출 전에이를 제거 할 수 있으므로 완료된 코드는 실행되지 않습니다.

+0

죄송합니다. 제안 해 주셔서 감사합니다. 그러나, 당신이 제안한 시도했지만 내 tableview 여전히 모든 셀을 표시하지 않습니다. –