2016-06-03 14 views
0

Also habe ich eine Tabellenansicht angepasst, die mehrere Spalten enthält. Ich möchte 3 Spalten und passe die TableViewCell an, außer dass ich an einem Roadblock bin.Swift: Anpassen von TableView zum Speichern mehrerer Datenspalten

Im Moment habe ich eine TableView, die in einem ViewController ist, und die TableView hält genau eine Spalte von Daten. Hier ändere ich es in drei Spalten und ich bekomme einen Fehler beim Auspacken eines optionalen Nil-Wertes.

Hier ist die wichtigen Teile des Viewcontroller mit dem Tableview (FinishTestController.swift):

var bestRank: [String] = ["1", "2", "3", "4", "5"] 
var bestScore: [String] = ["-----", "-----", "-----", "-----", "-----"] 
var bestTime: [String] = ["-----", "-----", "-----", "-----", "-----"] 
override func viewDidLoad() { 
    super.viewDidLoad() 

    addhighscore() 
    loadhighscores() 

    self.tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell") 
} 

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

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell 

    cell.column1.text = self.bestRank[indexPath.row]//<-- ERROR points here 
    cell.column2.text = self.bestScore[indexPath.row] 
    cell.column2.text = self.bestTime[indexPath.row] 

    return cell 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    println("You selected cell #\(indexPath.row)!") 
} 

func loadhighscores(){ 
    var result = db.query("SELECT * from EASY_MATH5 ORDER BY Score DESC, Time ASC LIMIT 5", parameters: nil) 
    println("===============================") 

    for row in result 
    { 
     bestScore[i] = row["Score"]!.asString() 
     print(bestScore[i]) 
     bestTime[i] = row["Time"]!.asString() 
     println(bestTime[i]) 

     i++ 
    } 
} 

Hier ist meine Zelle:

class TableViewCell: UITableViewCell { 

@IBOutlet weak var column1: UILabel! 
@IBOutlet weak var column2: UILabel! 
@IBOutlet weak var column3: UILabel! 


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 
} 

}

Und hier ist der Fehler, den ich bekommen:

Schwerwiegender Fehler: unerwartet wurde beim Entpacken von nil keine Option gefunden. V (lldb)

und verweist auf die Zeile "cell.column1.text = self.bestRank [indexPath.row]" mit einer Zeile "Thread 1: EXC_BAD_INSTRUCTION".

Irgendeine Idee, wie zu lösen?

+0

tun diese Spalten im Storyboard vorhanden sind? und hast du die IBOutlet-Verbindung erstellt? –

+0

@LukePatterson Ja, ich habe 3 Labels auf meinem Storyboard, die jeweils mit den TableViewCell-Labels verbunden sind. Die Beschriftungen im Storyboard befinden sich in einer Prototypzelle, die mit der tableviewcell -Klasse verbunden ist, und die Tabellenansicht, in der sie sich befinden, ist mit der finestest-Klasse verbunden, wo der erste Codeblock in meiner Frage von – Milap

+1

kommt. Ich würde einen Haltepunkt setzen an dieser Linie. Überprüfen Sie, ob "Zelle" initialisiert ist und dass die Labels, die Sie zu füllen versuchen, ebenfalls nicht Null sind. Wenn die Zelle null ist, ist die TableViewCell-Klasse wahrscheinlich nicht ordnungsgemäß registriert. Wenn die Labels null sind, handelt es sich wahrscheinlich um ein ähnliches Registrierungsproblem. – DJohnson

Antwort

2

entfernen

self.tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell") 

Von viewDidLoad(), müssen Sie Ihre UITableViewCell Unterklasse nicht registrieren, wenn Sie Prototyp-Zellen verwenden.

+0

Das war das Problem, danke für die Hilfe – Milap

0

Arbeiten mit dem Code, den ich kleinere Anpassungen gemacht, die ich habe in den Kommentaren stellte mit „// nb:“ - es funktioniert jetzt - sobald diese kleine Punkte entfernt wurden.

Nur andere Änderung in meinem Code, die ich tat, war die Verwendung von "Cell1" anstelle von "Zelle" und Name der benutzerdefinierten Zelle als "CustomTableViewCell" anstelle von "TableViewCell", aber das ist nur aus persönlicher Gewohnheit.

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet var tableView: UITableView! 

var bestRank : [String] = ["1", "2", "3", "4", "5"] 
var bestScore: [String] = ["-----", "-----", "-----", "-----", "-----"] 
var bestTime: [String] = ["-----", "-----", "-----", "-----", "-----"] 

// -------------------------------------- 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.bestRank.count // nb: use of "self." and no ";;" at end 
} 

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

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell1", forIndexPath: indexPath) as! CustomTableViewCell 

    cell.column1.text = self.bestRank[indexPath.row] 
    cell.column2.text = self.bestScore[indexPath.row] 
    cell.column3.text = self.bestTime[indexPath.row] 

    return cell 
} 

// -------------------------------------- 
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    print("You selected cell #\(indexPath.row)!") 
} 
// -------------------------------------- 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // nb: Not used: "self.tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell")" 

// nb: Datenquelle + Delegierten bereits mit Tableview in Storyboard mit Click-Drag & Drop in Viewcontroller zugewiesen. }


CustomCell wie das Ihre ...

class CustomTableViewCell: UITableViewCell { 

@IBOutlet var column1: UILabel! 

@IBOutlet var column2: UILabel! 

@IBOutlet var column3: UILabel! 

** Ergebnis = kein Fehler ** Simulator durchgeführt wurde zeigt Tisch, wie man wollte ...

enter image description here

+0

Das Problem war, dass registerClass bei der Verwendung von Prototypzellen nicht notwendig ist. Als ich das entfernte, funktionierte mein Code. Ich schätze deine Hilfe jedoch. – Milap

Verwandte Themen