2016-07-21 5 views
0

Ich bin sehr neu in der schnellen Entwicklung, und ich arbeite an this section eines Apple bereitgestellten Swift-Tutorials. Ich habe eine Steckdose für eine Beschriftung, ein Bild und eine benutzerdefinierte Ansicht erstellt, die in einer Tabellenzelle verschachtelt sind. Wenn ich laufe, bekomme ich diesen FehlerDiese Klasse ist nicht Schlüsselcodierung-kompatibel für den Schlüssel

2016-07-20 23: 16: 11.110 FoodTracker [8446: 3016336] Unbekannte Klasse MealTableViewCell in Interface Builder-Datei. 2016-07-20 23: 16: 11.124 FoodTracker [8446: 3016336] * Beenden App aufgrund der nicht abgefangenen Ausnahme 'NSUnknownKeyException', Grund: '[setValue: forUndefinedKey:]: Diese Klasse ist nicht Schlüsselwert codierungskonform für die SchlüsselnameLabel. ' * ersten Wurf Call-Stack:

Es gibt keine doppelten Auslässen und ich glaube, die cellIdentifier in meiner Tabelle verwendet View Controller korrekt ist. Meine Tabellenzelle

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

My Table View Controller

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

Dank!

+0

Haben Sie Klasse von RatingControl in Storyboard ?? –

Antwort

0

Zunächst müssen Sie Ihre UITableView von Ihrem Interface Builder zu Ihrer MealTableViewController Klasse verknüpfen (Ctrl + drag)

Dann werden in der viewDidLoad Methode Ihrer MealTableViewController Klasse, müssen Sie Ihre benutzerdefinierte Zelle Klasse Ihres Tabellenansicht registrieren :

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

+0

Danke für Ihren Kommentar, ich habe dies versucht und jetzt meine Zelle wird zurückgegeben, wenn ich "dequeueReusableCellWithIdentifier" aufrufen, aber seine Eigenschaften sind Null und ich kann nicht herausfinden, warum. Die Steckdosen für sie sind richtig eingerichtet –

1

Es ist sehr einfach, kann die Geschichte Board nicht in die Steckdose mit dem Namen "nameLabel" finden. Erstellen Sie entweder ein Label mit diesem Namen oder löschen Sie den Verweis des erstellten Labels aus dem Storyboard.

Hier sind die Schritte

einfach das Storyboard klicken und die letzte Tab auszuwählen. enter image description here

Suchen Sie nun nach dem NamenLabel und klicken Sie auf Kreuz, um die Verbindung zu trennen. Alles Gute;)

4

Suchen Sie in Ihrer Storyboard-Datei nach einem defekten Outlet-Link. Finden Sie Ihren Controller und control - klicken Sie auf den gelben Kreis über der Spitze, um die Aktionen und Ausgänge Popover zu öffnen. Sie sollten eine Steckdose für nameLabel mit einem gelben Warnzeichen sehen. Schließen Sie es entweder an die Datei Ihres Controllers an oder entfernen Sie es, wenn es ein Duplikat ist. enter image description here