【问题标题】:I got the UITableViewCell, but cell's elements are nil. Why?我得到了 UITableViewCell,但单元格的元素为零。为什么?
【发布时间】:2014-11-04 11:20:09
【问题描述】:

以下代码是上一篇文章的清理和重新哈希版本。
参考:This class is not key value coding-compliant for the key...why?

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!
    }  
...    
}

我正在获取单元格,但没有该单元格的元素。

1) Inside cell
(lldb) po cell!.TitleLabel
nil

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

为什么?

它现在正在看到牢房的成员...
但现在我得到了:

*** 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() 但仍然有同样的问题:

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")
    }
}

【问题讨论】:

    标签: uitableview swift


    【解决方案1】:

    您已将您的属性声明为隐式展开的可选项,并表明您确定它们不是 nil。因此不需要使用可选链。

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

    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 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()
    }  
    

    如果崩溃,则说明您的插座绑定有问题。

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

    【讨论】:

    • "return nil" --> Type 'UITableViewCell' 不符合协议 'NilLiteralConvertible' 是:我的 DiaryTableViewCell 设置为 nib 的类。
    • 好的,从我的示例代码中删除了nil。那个方法还会崩溃吗?
    • 我不得不恢复到我的原始代码,并使用修改后的小驼峰式插座。 func() 需要一个单元格值才能返回。仍然没有单元格的实例化元素。
    • 你的课是在一个笔尖?然后你必须打电话给registerNib(...)。删除registerClass(...)
    • 我已经相应地修改了代码(见上文)。但现在我收到运行时错误:*** 由于未捕获的异常 'NSUnknownKeyException' 导致应用程序终止,原因:'[ setValue:forUndefinedKey:]: 这个类不符合键 leftImageView 的键值编码.'
    【解决方案2】:

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

    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
        }
    }
    

    【讨论】:

    【解决方案3】:

    我找到了解决方案:
    This class is not key value coding-compliant for the key...why?

    这里是转发:

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

    结果如下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-15
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多