此类不是密钥值编码兼容的密钥

时间:2016-07-21 06:27:29

标签: ios swift uitableview class swift3

我对快速开发非常陌生,我正在研究提供快速教程的苹果this section。我创建了一个嵌套在表格单元格中的标签,图像和自定义视图的插座。当我跑步时我得到这个错误

  

2016-07-20 23:16:11.110 FoodTracker [8446:3016336] Interface Builder文件中的未知类MealTableViewCell。   2016-07-20 23:16:11.124 FoodTracker [8446:3016336] *由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不符合键值编码关键名称拉贝尔。   * 首先抛出调用堆栈:

没有重复的插座,我相信我的表视图控制器中使用的cellIdentifier是正确的。 我的表格单元格

import UIKit

class MealTableViewCell: UITableViewCell {

//    MARK: Properties
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var photoImageView: UIImageView!
@IBOutlet weak var ratingControl: RatingControl!

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

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

我的表视图控制器

import UIKit

class MealTableViewController: UITableViewController {
// MARK: Properties

var meals = [Meal]()

override func viewDidLoad() {
    super.viewDidLoad()
    loadSampleMeals()
}

func loadSampleMeals() {
    let photo1 = UIImage(named: "meal1")!
    let meal1 = Meal(name: "Caprese Salad", photo: photo1, rating: 4)!

    let photo2 = UIImage(named: "meal2")!
    let meal2 = Meal(name: "Chicken and Potatoes", photo: photo2, rating: 5)!

    let photo3 = UIImage(named: "meal3")!
    let meal3 = Meal(name: "Pasta with Meatballs", photo: photo3, rating: 3)!

    meals += [meal1, meal2, meal3]
}

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

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return meals.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // Table view cells are reused and should be dequeued using a cell identifier.
    let cellIdentifier = "MealTableViewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MealTableViewCell

    // Fetches the appropriate meal for the data source layout.
    let meal = meals[indexPath.row]

    cell.nameLabel.text = meal.name
    cell.photoImageView.image = meal.photo
    cell.ratingControl.rating = meal.rating

    return cell
}}

谢谢!

3 个答案:

答案 0 :(得分:6)

检查故事板文件中是否有损坏的插座链接。找到您的控制器并control - 单击其笔尖上方的黄色圆圈以打开操作和插座弹出窗口。您应该看到nameLabel的插座带有黄色警告标志。将其重新连接到您的控制器文件,如果重复,则将其删除。enter image description here

答案 1 :(得分:2)

它非常简单,故事板找不到名为“nameLabel”的插座。因此,要么使用该名称创建标签,要么从故事板中删除创建的标签的引用。

以下是步骤

只需点击故事板,然后选择最后一个标签。enter image description here

现在搜索nameLabel并单击cross以断开连接。 一切顺利;)

答案 2 :(得分:0)

首先,您必须将UITableView从界面构建器链接到MealTableViewController类(Ctrl + drag

然后,在viewDidLoad类的MealTableViewController方法中,您必须将自定义单元格类注册到表视图中:

self.tableView.registerClass(MealTableViewCell.self, forCellReuseIdentifier: "MealTableViewCell")