ios - 得到 NSUnknownKeyException' 的错误,原因 : setValue:forUndefinedKey: this class is not key value coding-compliant for the key description

标签 ios swift firebase uitableview

我面临着将数据从 HomeViewController 传递到 PostDetailViewController 的问题, 我检查了连接到 View Controller 的类是否正确,连接到 XIB 文件的类是 PostTableViewCell,

并且仍然得到这个错误

'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key description

点击表格单元格

HOMEVIEWCONTROLLER

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var tableView:UITableView!

    var posts = [Post]()
    var db: Firestore!

    var postKey:String = ""
    private var documents: [DocumentSnapshot] = []
    //public var posts: [Post] = []
    private var listener : ListenerRegistration!




    override func viewDidLoad() {
        super.viewDidLoad()

        db = Firestore.firestore()

        self.navigationController?.navigationBar.isTranslucent = false
        tableView = UITableView(frame: view.bounds, style: .plain)

        let cellNib = UINib(nibName: "PostTableViewCell", bundle: nil)
        tableView.register(cellNib, forCellReuseIdentifier: "postCell")
        tableView.backgroundColor = UIColor(white: 0.90,alpha:1.0)
        view.addSubview(tableView)

        var layoutGuide:UILayoutGuide!

        if #available(iOS 11.0, *) {
            layoutGuide = view.safeAreaLayoutGuide
        } else {
            // Fallback on earlier versions
            layoutGuide = view.layoutMarginsGuide
        }

        tableView.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
        tableView.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
        tableView.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true

        tableView.delegate = self
        tableView.dataSource = self
        tableView.reloadData()
        retrieveAllPosts()
        //checkForUpdates()

    }


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


    @IBAction func handleLogout(_ sender:Any) {
        try! Auth.auth().signOut()
        self.dismiss(animated: false, completion: nil)
    }


    func retrieveAllPosts(){
        let postsRef = Firestore.firestore().collection("posts").limit(to: 50)

        postsRef.getDocuments { (snapshot, error) in

            if let error = error {

                print(error.localizedDescription)

            } else {

                if let snapshot = snapshot {

                    for document in snapshot.documents {


                        let data = document.data()
                       // self.postKey = document.documentID
                        let username = data["username"] as? String ?? ""
                        let postTitle = data["postTitle"] as? String ?? ""
                        let postcategory = data["postcategory"] as? String ?? ""
                        let postContent = data["postContent"] as? String ?? ""

                        let newSourse = Post( _documentId: document.documentID, _username: username, _postTitle: postTitle, _postcategory: postcategory, _postContent: postContent)
                        self.posts.append(newSourse)
                        print(self.postKey)
                    }
                    self.tableView.reloadData()
                }
            }
        }
    }

       /* postsRef.getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    print("\(document.documentID) => \(document.data())")


                    self.posts = querySnapshot!.documents.flatMap({Post(dictionary: $0.data())})
                    DispatchQueue.main.async {
                        self.tableView.reloadData()

        }
}
            }
        }*/
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        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 cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
        cell.set(post: posts[indexPath.row])
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let post = self.posts[indexPath.row]
        //print("row selected: \(indexPath.row)")
        //Swift.print(post._documentId!)
       let postKey = post._documentId
        let postName = post._username
        print(postKey! + postName!)
        performSegue(withIdentifier: "toDetailView", sender: indexPath)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       //segue.forward(posts, to: segue.destination)
        guard let details = segue.destination as? PostDetailViewController,
        let index = tableView.indexPathForSelectedRow?.row

       else {
        return
        }
        details.detailView = posts[index]



    }

}

POSTTABLEVIEWCELL

class PostTableViewCell: UITableViewCell {

    @IBOutlet weak var usernameLabel: UILabel!
   @IBOutlet weak var profileImageView: UIImageView!
    @IBOutlet weak var subtitleLabel: UILabel!
    @IBOutlet weak var postTextLabel: UILabel!



    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code

       // profileImageView.layer.cornerRadius = profileImageView.bounds.height / 2
       // profileImageView.clipsToBounds = true
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func set(post:Post) {
        usernameLabel.text = post._username
        postTextLabel.text = post._postTitle
        subtitleLabel.text = post._postcategory
    }

}

发布细节 View Controller
类 PostDetailViewController: UIViewController {

    @IBOutlet var usernamelabel: UILabel!


    @IBOutlet var posttitlelabel: UILabel!

    @IBOutlet var postIdlabel: UILabel!

   // @IBOutlet var description: UILabel!
    @IBOutlet var postcategorylabel: UILabel!

    var detailView: Post?
    var postId:String = ""
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        postIdlabel?.text = detailView?._documentId
        posttitlelabel?.text = detailView?._postTitle

    }


    /*
    // 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.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

最佳答案

这种情况通常发生在您已经在 XIB 文件中设置 IBOutlet 并且您在代码中注释掉它的连接 socket 时。

在你的情况下,在你的 PostDetailViewController

// @IBOutlet var description: UILabel!

您已经评论了描述标签,但 IBOutlet 仍然连接在您的 XIB 文件中。

因此,查找您的 XIB 文件并检查事件的 IBOutlet 连接,并删除它以获取描述标签、清理、构建和运行。

希望对您有所帮助。

关于ios - 得到 NSUnknownKeyException' 的错误,原因 : setValue:forUndefinedKey: this class is not key value coding-compliant for the key description,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751794/

相关文章:

ios - 带有图像的 UIColor 颜色在 IOS 7 下不起作用

ios - 如何在 UITableViewCells 之间添加间距 - Swift

ios - Firebase 崩溃报告 : Failed to transmit crash: Error 400

ios - 多个位置的 Firebase updateChildValue

ios - 类布局

ios - Flutter:Runner.app/Info.plist 不存在。 Flutter "Thin Binary"构建阶段必须在 "Copy Bundle Resources"之后运行

swift - 当抛出一个可选的-nil错误时,如何获得默认的错误字符串?

swift - 如何以编程方式删除 CloudKit "Field Names"?

arrays - 如何将数据插入到空数组的文本字段中,然后显示在标签中?

javascript - Firebase 云函数 - 如何获取模型数据