【问题标题】:Reusable cell not creating from prototype cell?可重复使用的单元不是从原型单元创建的?
【发布时间】:2018-01-01 21:00:18
【问题描述】:

我正在创建一个 iOS 应用程序,它从 Firebase 数据库加载数据,然后使用这些信息创建一个 UI 表视图。我创建了一个带有重用标识符“cell”的原型单元,以及一个带有标签的自定义单元类。但是,当应用程序加载时,创建的单元格不具有我为原型单元格创建的样式,即使可重用单元格与原型单元格具有相同的标识符。我无法更改原型单元格的标签文本,加载应用程序时得到的只是具有默认单元格高度的空白行,而不是我添加到原型单元格的自定义设置。

这是 UITableView 文件的代码

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {


    var ref: DatabaseReference!
        var postList = [Post]()
        var refHandle : UInt!

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
            super.viewDidLoad()
            //let userID = Auth.auth().currentUser?.uid
            ref = Database.database().reference().child("posts") //.child(userID)
            tableView.register(PostTableViewCell.self, forCellReuseIdentifier: "cell")
            fetchPosts()

        }


        public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return postList.count
        }

        public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PostTableViewCell
            //set cell content
            let contentOfCellPost = postList[indexPath.row]
            cell.title?.text = contentOfCellPost.post_words
            return cell
        }

        func fetchPosts () {

            let query = ref.queryOrdered(byChild: "timestamp").queryLimited(toFirst: 10)
            query.observe(.value) { (snapshot) in
                for child in snapshot.children.allObjects as! [DataSnapshot] {
                    if let value = child.value as? NSDictionary {
                        let post = Post()
                        let poster = value["poster"] as? String ?? "Name not found"
                        let post_content = value["post"] as? String ?? "Content not found"
                        post.post_words = post_content
                        post.poster = poster
                        self.postList.append(post)
                        DispatchQueue.main.async { self.tableView.reloadData() }
                    }
                }
            }
        }

}

这是我为自定义单元格创建的类:

import UIKit

class PostTableViewCell: UITableViewCell {


    @IBOutlet weak var title: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()

        // Initialization code
    }

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

        // Configure the view for the selected state
    }

}

但是,当我将可重复使用的单元格属性更改为

cell.textLabel?.text = contentOfCellPost.post_words

我可以在表格视图中看到文本,但它仍然不是基于我在情节提要中的原型单元格规范。

image of table view

【问题讨论】:

    标签: ios swift uitableview firebase firebase-realtime-database


    【解决方案1】:

    您错过了实现 heightForRowAt 或使用动态 tableView 单元格高度(如果您愿意)

    【讨论】:

    • 我认为你没有完全理解这个问题。从出队可重用单元格创建的表格视图单元格不遵循具有图像等的故事板规范,即使出队可重用单元格函数与故事板中的原型单元格具有相同的标识符。
    【解决方案2】:

    你的问题是这一行:

    tableView.register(PostTableViewCell.self, forCellReuseIdentifier: "cell")
    

    如果您为表格视图注册了一个类,那么当您将其出列时,您会得到该类的一个空白单元格,而不是情节提要中的一个。因此不会设置任何内容(IBOutlet、IBAction 等)。

    如果您只想将故事板(或 XIB 文件)中定义的原型单元出列,则不需要注册它。

    【讨论】:

    • 当我删除该行时,我可以看到我在应用程序的情节提要中设置的背景颜色。但是,即使我设置了 'cell.label.text = contentOfCellPost.post_words' ,我仍然看不到我连接的文本标签。此外,它仍然没有为数据库中的每个实例创建帖子,而是现在具有默认高度的 UIcells,而不是我在情节提要中设置的高度。 @UpholderOfTruth
    • 您能否发布您如何设置情节提要的详细信息,我会再看一下。另请记住,您不是在单元格上设置高度,而是在 UITableView 本身上设置高度。
    • 我在问题中添加了一张图片。删除注册代码行后,我可以在背景中看到紫色,但即使单元类有一个 UIOutlet 并且我的代码通过将 cell.label.text 设置为什么来访问它,我仍然看不到文本帖子内容是。
    • 1) 紫色背景是什么?是内容视图的单元格本身还是其他? 2)你是如何设置单元格的高度的? 3) 示例中似乎有两个紫色单元格。这是您期望的正确数量的单元格吗? 4) 故事板中的 IBOutlet 链接是否正确?
    • 如果你愿意,你可以上传项目或测试版本,我可以仔细看看。
    【解决方案3】:

    当您使用 Storyboard 时,请从 viewDidLoad 函数中删除以下行。

                tableView.register(PostTableViewCell.self, forCellReuseIdentifier: "cell")
    

    【讨论】:

      猜你喜欢
      • 2014-05-18
      • 1970-01-01
      • 2013-02-10
      • 2020-08-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多