2017-12-21 11 views
1

소셜 미디어 앱을 프로그래밍하려고하는데 해당 셀에 게시물을 표시하고 싶습니다. 셀의 유일한 항목은 게시물의 레이블과 주제의 레이블입니다. 코드를 실행할 때 오류는 없지만 셀이 테이블에 표시되지 않습니다. 나는 그 문제를 알아낼 수 없다. 도움을 주셔서 감사합니다.TableView 용 셀이 보이지 않습니다.

import UIKit 
import Firebase 
import FirebaseDatabase 
import FirebaseStorage 
import FirebaseAuth 
import SwiftKeychainWrapper 

class FeedVC: UIViewController, UITableViewDelegate, UITableViewDataSource,  UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

@IBOutlet weak var postBtn: UIButton! 
@IBOutlet var tableView: UITableView! 

var posts = [Post]() 
var post: Post! 
var userName: String! 

var refPosts: DatabaseReference! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 
    //getting a reference to the node posts 
    refPosts = Database.database().reference().child("posts") 

    //observing the data changes 
    refPosts.observe(DataEventType.value, with: { (snapshot) in 

     //if the reference have some values 
     if snapshot.childrenCount > 0 { 

      //clearing the list 
      self.posts.removeAll() 

      //iterating through all the values 
      for data in snapshot.children.allObjects as! [DataSnapshot] { 
       //getting values 
       let postObject = data.value as? [String: AnyObject] 
       let id = postObject?["id"] 
       let thought = postObject?["thought"] 
       let likes = postObject?["likes"] 

       //creating artist object with model and fetched values 
       let post = Post(_id: id as! String, _thought: thought as! String?, _likes: likes as! Int?) 
       //appending it to list 
       self.posts.append(post) 
      } 

      //reloading the tableview 
      self.tableView.reloadData() 
     } 
    }) 


    /*refPosts.observe(.value, with: {(snapshot) in 
     if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { //all objects in snapshot 

      self.posts.removeAll() 

      for data in snapshot { 
       print(data) 
       if let postDict = data.value as? Dictionary<String, AnyObject>{ 
        let key = data.key 
        let post = Post(postKey: key, postData: postDict) 
        self.posts.append(post) 
       } 
      } 
     } 
     self.tableView.reloadData() 
    })*/ 

} 
func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let post = posts[indexPath.row] 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell") as? PostCell{ 
     cell.configCell(post: post) 
     return cell 
    }else{ 
     return PostCell() 
    } 
} 

func PostToFirebase(imgUrl: String){ 
    let userID = Auth.auth().currentUser?.uid 

    Database.database().reference().child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in 
     if let data = snapshot.value as? Dictionary<String, AnyObject>{ 
     //if let snap = snapshot.value as? [String:Any] { 
      let data = snapshot.value as! Dictionary<String, AnyObject> 

      let username = data["username"] 

      let post: Dictionary<String, AnyObject> = [ 
       "username": username as AnyObject, 
       "likes": 0 as AnyObject 
      ] 
      let firebasePost = Database.database().reference().child("posts").childByAutoId() 
      firebasePost.setValue(post) 
      self.tableView.reloadData() 
     } 
    }) 
} 

@IBAction func postImageTapped(_ sender: AnyObject){//leads to text field box -> What are you thinking? 
    //present(imagePicker, animated: true, completion: nil) 
    //performSegue(withIdentifier: "UploadPage", sender: nil) 
} 

@IBAction func SignOut (_ sender: AnyObject){ 

    try! Auth.auth().signOut() 

    KeychainWrapper.standard.removeObject(forKey: "uid") 

    dismiss(animated: true, completion: nil) 
} 
} 
+0

디자인 오류 일 수 있습니다. 기본적으로'dequeueReusableCell'에서 셀을 downcast하지 않습니다. 다른 API'dequeueReusableCell (withIdentifier : for :')을 사용하고 셀을'! PostCell '처럼 강제로 unwrap합니다. 모든 것이 제대로 연결되면 코드는이 줄에서 충돌해서는 안됩니다. 이것은 선택적 다운 캐스트가 무의미한 아주 드문 경우 중 하나입니다 – vadian

+0

이렇게하면? post cellell = tableView.dequeueReusableCell (withIdentifier : for! PostCell) {' –

+0

아니요, 'cell = tableView.dequeueReusableCell (withIdentifier : "PostCell", for : indexPath)을! PostCell로 설정하면됩니다. {if.}','''후행 없음'{'. 충돌이 발생하면 인터페이스 빌더 – vadian

답변

1

@vadian은 주석에서 언급했듯이 모든 시나리오가 올바르게 설정되었다고 간주하면이 시나리오에서 캐스트를 강제 적용해도 좋습니다. 아래에있는 인쇄 문을 추가하여 셀에서 발생하는 상황을 자세히 볼 수 있습니다.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let post = posts[indexPath.row] 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell") as? PostCell { 
     print("dequeueing cell") 
     cell.configCell(post: post) 
     return cell 
    }else{ 
     print("initialising cell") 
     return PostCell() 
    } 
} 

해결 방법에는 인덱스 경로를 사용하고 캐스트를 강제하는 새로운 dequeue 메소드를 사용하는 것이 포함됩니다.

let post = posts[indexPath.row] 
let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostCell 

cell.configCell(post: post) 

return cell 
+0

인쇄 된 의견을 보았습니다. 그것은 단지 "셀 초기화"를 계속했습니다. –

+0

오른쪽으로 대기열 해제 된 셀이 nil이거나 "PostCell"에 캐스팅 될 수 없음을 입증했습니다. – Callam

+0

그럼 어떻게 해결할 수 있습니까? –