【问题标题】:Swift TableViewCell empty when cell has values当单元格有值时,Swift TableViewCell 为空
【发布时间】:2016-10-29 15:28:19
【问题描述】:

我有一个带有一些简单标签和 UIImage 的自定义单元格。一切似乎都设置正确,单步调试调试器显示所有内容都在获取值,甚至使用调试器中的打印显示标签有文本。但是我的表格视图在执行时仍然是空的。我已经看这个太久了,无法弄清楚问题所在。

这是单元格代码

class CurrentFileCell: UITableViewCell {


@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var statusImage: UIImageView!
@IBOutlet weak var dateLabel: UILabel!


var currentContent: AircraftContent! {
    didSet{
        setStyles(Constants.appStyleSetting)

        self.nameLabel.text = currentContent.contentName
        self.dateLabel.text = currentContent.contentStatus
        self.statusImage.image = UIImage(named: "color_label_circle_green")

    }
}

override func awakeFromNib() {
    super.awakeFromNib()
}

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

private func setStyles(settings: StyleSettings) {
    let tableFont = UIFont(name: settings.bodyFont, size: CGFloat(settings.tableFontSize))
    nameLabel.font = tableFont
    dateLabel.font = tableFont

    // Text color
    let tableFontColor = settings.tableFontColor
    nameLabel.textColor = tableFontColor
    dateLabel.textColor = tableFontColor
}

这是 ViewController 代码,里面有一个 tableview。

class CurrentFilesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var content: AircraftContent?

@IBOutlet weak var currentFiles: UILabel!
@IBOutlet weak var downloadingLabel: UILabel!
@IBOutlet weak var readyLabel: UILabel!

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self

    self.content = loadContent()
    setStyles(Constants.appStyleSetting)
    //self.tableView.reloadData()
            // Do any additional setup after loading the view.
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CurrentFileCell", forIndexPath: indexPath) as? CurrentFileCell
    cell?.currentContent = content

    return cell!
}


func loadContent() -> AircraftContent {
    return (NSKeyedUnarchiver.unarchiveObjectWithFile(AircraftContent.ArchiveURL.path!) as? AircraftContent)!
}

private func setStyles(settings: StyleSettings) {
    let titleFont = UIFont(name: settings.bodyFont, size: CGFloat(settings.titleFontSize))
    let key = UIFont(name: settings.bodyFont, size: CGFloat(settings.tableFontSize))
    currentFiles.font = titleFont
    downloadingLabel.font = key
    readyLabel.font = key

    // Text color
    let titleFontColor = settings.titleFontColor
    currentFiles.textColor = titleFontColor
    downloadingLabel.textColor = titleFontColor
    readyLabel.textColor = titleFontColor

}

这里有一些图片显示了调试位置,其中单元格不为空,并且还打印出具有值但在模拟过程中未显示的标签。

http://imgur.com/a/dBkpe

这是显示原型单元的图像。该单元格具有正确的类集以及标识符。

http://imgur.com/PKtFTeQ

最后一张图片显示原型单元格链接到 CurrentFileCell 中的标签。

http://imgur.com/nW0QUjM

对此的任何帮助将不胜感激。我尝试重新创建所有内容,但仍然感到困惑,因为似乎一切都应该是这样。

【问题讨论】:

  • 你的数据数组在哪里?
  • 你试过在主线程中执行 currentContent 的 didSet 吗?
  • 我没有数据数组,现在只有一个变量。 @Ozgur Ersil
  • 你到底是什么意思?我不应该设置它,而只更新单元格的对象。 @Caelan
  • 确保您也将自定义类注册到 tableView。

标签: ios swift uitableview model-view-controller


【解决方案1】:

你必须为表格视图实现 'heightForRowAtIndexPath' 方法

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        let height:CGFloat = 75
        return height

}

【讨论】:

  • 我尝试了多种不同的高度,但它并没有改变任何东西。它仍然只是一个空单元格。有什么想法吗?
  • 嗯,我的下一个猜测将是 Ike10 的路线。确保您在故事板的检查器窗格中声明了单元格重用标识符,并确保您注册了该类。您可以在故事板中执行此操作,也可以像 Ike10 的回答一样以编程方式执行此操作
【解决方案2】:

您可以考虑注册自定义类,因为它看起来不像您那样做。您可以通过在视图控制器的viewDidLoad 中使用以下代码来做到这一点。

tableView.registerClass(CurrentFileCell.self, forCellReuseIdentifier: "cell")

如果您使用的是外部笔尖,您将希望使用registerNib,如下所示:

tableView.registerNib(UINib(name:"ReplaceWithYourNibName", bundle: nil), forCellReuseIdentifier: "ReuseIdentifier")

当然,将ReplaceWithYourNibNameReuseIdentifier 替换为适当的值。此外,如果您的 nib 在不同的包中,请指定它而不是 nil(nil 默认为主包)。

但是,不要同时使用registerClassregisterNib,因为您最后调用的那个将被使用,并且它们被设计为互斥的。每当您制作自定义 UITableViewCell 时,您必须使用两者中的任何一个才能使其工作,除非您已在情节提要中明确设置它。

另外,您可以改为使用原型单元格来定义您的自定义单元格,我相信这会自动注册该单元格。但如果您不使用原型单元,请确保使用registerClassregisterNib

祝你好运!希望这会有所帮助!

【讨论】:

  • 我用过这个,但现在它在我的自定义单元类中给了我一个奇怪的错误。它正在尝试设置标签的值,但它收到一个错误,说打开一个可选的 nil 值。这是调试器的位置,也显示文本有效。 imgur.com/xWEirpp
  • 在使用dequeReusableCellWithIdentifier (forIndexPath) 时尝试强制转换。就像let cell = tableView.dequeueReusableCellWithIdentifier("CurrentFileCell", forIndexPath: indexPath) as! CurrentFileCell
  • 仍然发生同样的事情。只是一个空的牢房,里面什么都没有。即使我在单元格中放置了一些永远不会改变或被编辑的东西,它也不会显示出来。不管它是什么,都存在一个空单元格。我在项目中的其他 2 个地方使用了相同的 tableview 方法和自定义单元格,并且没有遇到任何问题,所以我对这里发生的事情感到茫然。
【解决方案3】:

如果你的单元格是静态单元格,那么你需要在 UITableViewDataSource 中注释掉这些方法:

/*    override func numberOfSections(in tableView: UITableView) -> Int {
 // #warning Incomplete implementation, return the number of sections
    return 0
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 0
} */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多