首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我得到了UITableViewCell,但是cell的元素是空的。为什么?

我得到了UITableViewCell,但是cell的元素是空的。为什么?
EN

Stack Overflow用户
提问于 2014-11-04 19:20:10
回答 3查看 425关注 0票数 0

下面的代码是上一篇文章的清理和重新散列版本。

参考:This class is not key value coding-compliant for the key...why?

代码语言:javascript
运行
复制
import Foundation
import UIKit

var x = 1

struct DiaryItem {
    var title:String?
    var subTitle:String?
    var leftImage:UIImage?
    var rightImage:UIImage?
    init(title:String, subTitle:String) {
        self.title = title
        self.subTitle = subTitle
    }
}

class DiaryTableViewCell: UITableViewCell {
    @IBOutlet weak var TitleLabel: UILabel!
    @IBOutlet weak var SubTitleLabel: UILabel!
    @IBOutlet weak var leftImageView: UIImageView!
    @IBOutlet weak var rightImageView: UIImageView!
}


class DiaryTableViewController: UITableViewController {
    let kCellIdentifier = "DiaryCell"
    var diaryCell:DiaryTableViewCell?
    var objects = NSMutableArray()  //...global var.

    override func viewDidLoad() {
        self.title = "My Diary"
        tableView.registerClass(DiaryTableViewCell.self, forCellReuseIdentifier: kCellIdentifier)
    }

    // -----------------------------------------------------------------------------------------------------
    // MARK: - UITableViewDelegate

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let controller = gStoryboard.instantiateViewControllerWithIdentifier("DiaryPlayerVC") as DiaryPlayerViewController
        self.navigationController?.pushViewController(controller, animated: true)
    }

    // -----------------------------------------------------------------------------------------------------
    // MARK: - UITableViewDataSource

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    // -----------------------------------------------------------------------------------------------------
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    // -----------------------------------------------------------------------------------------------------
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as DiaryTableViewCell?
        // cell?.selectionStyle = .None

        println("\(x++)) Inside cell")
        cell!.TitleLabel?.text = "Hello"
        cell!.TitleLabel?.backgroundColor = UIColor.blueColor()
        cell!.SubTitleLabel?.text = "World"
        cell!.contentView.backgroundColor = UIColor.redColor()

        return cell!
    }  
...    
}

我要拿到细胞,但没有细胞的成分。

代码语言:javascript
运行
复制
1) Inside cell
(lldb) po cell!.TitleLabel
nil

我清理了代码,它可以正常编译和运行。该单元格已加载并被涂成红色,因此我可以看到它已加载。但是没有一个单元格的内容是实例化的。

为什么?

它现在看到了细胞的成员..。

但现在我得到了:

代码语言:javascript
运行
复制
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x7f9691594810> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key leftImageView.'

如果我断开插座,我会得到图像:

我已经添加了所需的init(),但仍然有相同的问题:

代码语言:javascript
运行
复制
class DiaryTableViewCell: UITableViewCell {
    @IBOutlet weak var leftImageView: UIImageView!
    @IBOutlet weak var rightImageView: UIImageView!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var subTitleLabel: UILabel!

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        NSLog("init coder")
    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-11-04 20:11:13

您已经将您的属性声明为隐式未包装的可选参数,并在您的签名中确认它们不为空。因此,不需要使用可选链接。

请使用小写的属性名称,因为类名称使用大写名称:

代码语言:javascript
运行
复制
class DiaryTableViewCell: UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var subTitleLabel: UILabel!
    @IBOutlet weak var leftImageView: UIImageView!
    @IBOutlet weak var rightImageView: UIImageView!
}

然后试试这个:

代码语言:javascript
运行
复制
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    if let cell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as? DiaryTableViewCell {
        // cell.selectionStyle = .None

        println("\(x++)) Inside cell")
        cell.titleLabel.text = "Hello"
        cell.titleLabel.backgroundColor = UIColor.blueColor()
        cell.subTitleLabel.text = "World"
        cell.contentView.backgroundColor = UIColor.redColor()

        return cell
    }

    return UITableViewCell()
}  

如果它崩溃了,一定是你的出口绑定出了问题。

您是否在InterfaceBuilder中将DiaryTableViewCell设置为nib的类?

票数 0
EN

Stack Overflow用户

发布于 2014-11-04 21:25:45

您的tableCellClass缺少用于nib的awakeFromNib()方法:

代码语言:javascript
运行
复制
class DiaryTableViewCell: UITableViewCell {
    @IBOutlet weak var TitleLabel: UILabel!
    @IBOutlet weak var SubTitleLabel: UILabel!
    @IBOutlet weak var leftImageView: UIImageView!
    @IBOutlet weak var rightImageView: UIImageView!

    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
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-11-05 03:43:24

我找到了解决方案:

This class is not key value coding-compliant for the key...why?

这是转帖:

我将UI元素链接到了错误的来源:

结果如下:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26733848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档