2014-10-16 6 views
5

Ich kann nicht herausfinden, warum diese benutzerdefinierte Zelle nicht ausgegeben wird.
Swift: IBoutlets sind Null in benutzerdefinierte Zelle

Ich habe eine benutzerdefinierte Zelle in einem Storyboard (keine Feder) eingerichtet. Ich habe ein Textfeld und 2 Etiketten, die Null sind, wenn ich versuche, auf sie in der benutzerdefinierten Zellklasse zuzugreifen. Ich bin mir fast sicher, dass ich alles richtig angeschlossen habe, aber immer noch Null.

Ich habe meine Tabellenzelle im Storyboard ausgewählt und eingestellt benutzerdefinierte Klasse TimesheetTableViewCell Ich habe die Kontrolle auch auf dem Tisch angeklickt und stellen Sie die Datenquelle und Delegierter TimesheetViewController

Meine benutzerdefinierte Zelle Klasse sein:

import UIKit 

class TimesheetTableViewCell: UITableViewCell { 

@IBOutlet var duration: UITextField! 
@IBOutlet var taskName: UILabel! 
@IBOutlet var taskNotes: UILabel! 

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

override init?(style: UITableViewCellStyle, reuseIdentifier: String!) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    println("Cell's initialised")// I see this 
    println(reuseIdentifier)// prints TimesheetCell 
} 


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

func setCell(duration: String, taskName: String, taskNotes: String){ 
    println("setCell called") 
    self.duration?.text = duration 
    self.taskName?.text = taskName 
    self.taskNotes?.text = taskNotes 
} 

Mein Controller:

class TimesheetViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ 

@IBOutlet var timesheetTable: UITableView! 

var items = ["Item 1", "Item2", "Item3", "Item4"] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell") 

} 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("TimesheetCell", forIndexPath: indexPath) as TimesheetTableViewCell 
     println(items[indexPath.row]) // prints corresponding item 
     println(cell.duration?.text) // prints nil 
     cell.setCell(items[indexPath.row], taskName: items[indexPath.row], taskNotes: items[indexPath.row]) 
     return cell 
} 
+1

anstelle von 'self.timesheetTable.registerClass (...)': benutze 'self.timesheetTable.registerNib (...)', vielleicht ...? – holex

Antwort

31

Das Problem ist, diese Zeile:

self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell") 

es löschen. Diese Zeile sagt: "Do nicht Holen Sie sich die Zelle aus dem Storyboard." Aber Sie tun wollen die Zelle aus dem Storyboard bekommen.

(Achten Sie aber darauf, dass die Kennung der Zelle "TimesheetCell" im Storyboard ist, oder Sie werden abstürzen.)

+0

Ok, das hat meine Standard-Zellendaten angezeigt bekommen. Vielen Dank! Ich kann immer noch nicht auf die iBoutlets zugreifen, keine Idee? versuchen, self.taskName? .text = "etwas" in cell.setCell hat keine Wirkung, weil taskName ist null –

+0

Beweisen Sie mir, dass die Steckdosen von der Zelle zu den Aufklebern in der Zelle wirklich angeschlossen werden, bitte! – matt

+0

Haha! Ich würde aber schon weitergemacht und meinen Code geändert. Ich endete am Anfang wieder und Erstellen einer Feder zusammen mit der benutzerdefinierten Zelle Klasse, dann in meinem contoller viewdidload() habe ich diese self.timesheetTable.registerNib (UINib (nibName: "TimesheetTableViewCell", Bundle: Nil)!, ForCellReuseIdentifier: "TimesheetCell "). Ich schätze deine Hilfe matt, danke. –

1

Ziemlich sicher, dass Sie die Linie

self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell") 

von viewDidLoad entfernen müssen ().