2017-05-02 6 views
1

이전에 테이블 뷰에서 선택한 사용자의 게시물을 검색하는 데 문제가 있습니다. 이름, 프로필 사진 등의 사용자 정보를 검색 할 수 있지만 게시물을 가져 오는 데 어려움이 있습니다. 지금은 코드가 아무것도 반환하지 않습니다. 아래 코드를 게시했습니다. 문제가있는 곳은 이며 여기서 나는 loadUserPosts() 함수를 호출합니다. 어떤 도움이라도 미리 감사드립니다.테이블 뷰에서 선택한 사용자의 게시물을 검색하는 방법

tableview controller 

@IBOutlet weak var searchTableView: UITableView! 
var profiles = [user]() 
var ref: FIRDatabaseReference! 

override func viewdidload(){ 
ref = FIRDatabase.database().reference() 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "guestSegue", sender: self) 
    self.searchTableView.deselectRow(at: indexPath as IndexPath, animated: true) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "guestSegue" { 

     if let indexpath = searchTableView.indexPathForSelectedRow { 

      let tabBarController = segue.destination as! UITabBarController 


      let guestVC = tabBarController.viewControllers![0] as! guestProfileViewController 


      _ = tabBarController.viewControllers![1] as! guestPhotoViewController 


      _ = tabBarController.viewControllers![2] as! guestVideoViewController 


      guestVC.ref = profiles[indexpath.row].ref 

       print(indexpath) 

      } 
     } 
    } 

guestPhotoViewController - 나는 중포 기지

class guestPhotoViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 


    @IBOutlet weak var backgroundProfileImage: UIImageView! 

    @IBOutlet weak var profileImage: roundImage! 

    @IBOutlet weak var fullNameLabel: UILabel! 

    @IBOutlet weak var postCell: UITableViewCell! 

    @IBOutlet weak var postTableView: UITableView! 


var ref: FIRDatabaseReference! 

var posts = [Post]() 



override func viewDidLoad() { 
    super.viewDidLoad() 


    loadUserPosts() 

    ref = FIRDatabase.database().reference() 

} 

func loadUserPosts(){ 

if let ref = ref { 


    let postsRef = ref.child("post") 


    postsRef.observe(.value, with: { (snapshot) in 

       for post in snapshot.children { 

        let post = Post(snapshot: post as! FIRDataSnapshot) 

        self.posts.append(post) 

       print(post) 
       self.postTableView.reloadData() 

      } 
     }) 
    } 

} 

게시물의 배열에서

class Post{ 
    var profilePic: String! 
    var fullName: String! 
    var postImage: String! 
    var postCaption: String! 
    var date: NSNumber! 

init(profilePic: String, fullName:String, postImage:String, postCaption: String, date:NSNumber){ 
    self.profilePic = profilePic 
    self.fullName = fullName 
    self.postImage = postImage 
    self.postCaption = postCaption 
    self.date = date 
} 

init(snapshot:FIRDataSnapshot) { 
    self.profilePic = (snapshot.value! as! NSDictionary)["profilePic"] as! String! 
    self.date = (snapshot.value! as! NSDictionary)["dateOfPost"] as! NSNumber! 
    self.fullName = (snapshot.value! as! NSDictionary)["fullName"] as! String! 
    self.postImage = (snapshot.value! as! NSDictionary)["postedPic"] as! String! 
    self.postCaption = (snapshot.value! as! NSDictionary)["postCaption"] as! String! 
} 

답변

0

몇 가지 게시물을 검색하기 위해 노력하고있어 어디 :

1 : 당신 오버라이드 (override)하는 경우 적용될 때 super.method으로 전화하는 것을 잊지 마십시오.

2 : 무엇이 실패하는지에 대해서는 명확하지 않습니다. 또는 데이터를 표시하기위한 테이블 뷰 업데이트입니다.

guestPhotoViewController 참조를 설정하기 전에 호출하는 것으로 보입니다. 역으로 그렇게하지 않아야합니까? 먼저 참조를 설정 한 다음 요청을 만드시겠습니까? 그렇지 않으면 if let ref = ref이 항상 실패합니다.

편집 : 새 문제인 경우 검색하는 데이터를 필터링하는 방법에 대한 문제인 것처럼 보입니다. 또는이 경우, 당신은 어떻게 이 아니며을 걸러 내고 있습니다. 에서 (당신의 요구에 맞게)이 같은

시도 뭔가

귀하의 회신 @AleRavasio에 대한 guestPhotoViewController

class guestPhotoViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    @IBOutlet weak var backgroundProfileImage: UIImageView! 
    @IBOutlet weak var profileImage: roundImage! 
    @IBOutlet weak var fullNameLabel: UILabel! 
    @IBOutlet weak var postCell: UITableViewCell! 
    @IBOutlet weak var postTableView: UITableView! 
    private var ref: FIRDatabaseReference! 
    private var posts = [Post]() 
    private var posterId: Int = -1 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     ref = FIRDatabase.database().reference() 
     loadUserPosts() 
    } 

    func prepareVC(withId: id) { 
     self.posterId = id 
    } 

    func loadUserPosts(){ 
     if self.id != -1 { 
      if let ref = ref { 
       /* Probably something around here is messed up. You don't seem to be filtering by id, just retrieving "post". 
        You might want to consider checking how you filter (you don't seem to do so at all) the postRef, since that seems to be the issue. 
        I don't know your FireBase models, so it's harder to help you with that. 
       */ 
       let postsRef = ref.child("post").equalTo(self.posterId) 
       /* 
       or if they are ordered, you can use: 
       let postsRef = ref.queryOrderedByChild("post").queryEqualToValue(self.posterId) 
       */ 
       postsRef.observe(.value, with: { (snapshot) in 
        for post in snapshot.children { 
         let post = Post(snapshot: post as! FIRDataSnapshot) 
         self.posts.append(post) 
         print(post) 
         self.postTableView.reloadData() 
        } 
       }) 
      } 
     } 
    } 
} 
+0

감사에서 tableViewVC

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let vc = UIStoryboard(name: "Name", bundle: nil).instantiateViewController(withIdentifier: "vcIdentifier") as! YourViewController vc.prepareVC(withId: indexPath.row) self.navigationController?.pushViewController(vc, animated: true) } 

. 내가 실수로 loadUserPost를 호출하기 전에 참조를 변경 했으므로 이제는 선택한 사용자의 게시물뿐만 아니라 모든 사용자의 게시물을로드하므로 문제가 발생합니다. 이전 tableview에서 선택한 사용자의 게시물 만 호출하는 방식으로 코딩하는 방법을 모르겠습니다. 저 좀 도와 주 시겠어요? 나는 다른 정보를 검색하기 위해 유사한 호출 메소드를 사용했으며 작동했다. 임 세상은 코딩에 익숙하지 않으므로 실례가되지 않는다면 변명 할 것입니다. –

+0

필자가 작성한 코드로 코드를 업데이트하려고했지만 어떤 행운을 얻지는 못했습니다. 인덱스와 함께 prepareVC init과 함께 오류가 발생합니다. 내 게시물 배열에 참조를 추가했지만 문제가 여전히 올바른 게시물을 검색하는 데 있습니다. Firebase에서 나는 그것을 "게시물"로 정했습니다. child (userID) .child (postID)가 도움이된다면 조금 더 잘 이해할 수 있습니다. @AleRavasio –