2016-05-10 27 views
0

Ich baue eine Seitenleiste mit Swift. Und ich habe diesen Fehler in diesem Code:Kann der Typ 'UIColor' nicht dem Typ 'String?' Zugewiesen werden?

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

    if cell == nil{ 
     cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") 

     cell!.backgroundColor = UIColor.clearColor() 
     cell!.textLabel!.text = UIColor.darkTextColor() 
    } 

    // Configure the cell... 

    return cell 
} 

So gibt es tatsächlich jemand auf dieser Plattform, die das gleiche Problem hat. In der Lösung, sagte sie, dass ich eine ! hinter UIColor.darkTextColor() hinzuzufügen, aber wenn ich tun, dass ein anderer Fehler ist, dass ich !

Der Fehler ist in der Zeile löschen haben:

Zelle .textLabel!

Wissen Sie, was los ist?

+1

Was ist die Fehlermeldung? –

+0

@JeffPuckettII Im Titel? – Hamish

Antwort

1

Der Fehler ist auf diesen Code:

cell!.textLabel!.text = UIColor.darkTextColor() 

Sie zuweisen UIColor zu einer Eigenschaft, die eine String (text Eigenschaft UILabel) wird erwartet.

Ich glaube, Sie wahrscheinlich suchen die text color, zu ändern, wenn so müssen Sie den Code ändern wie:

cell!.textLabel!.textColor = UIColor.darkTextColor() 
+0

Ich bin neu in Xcode Was soll ich stattdessen schreiben? –

+0

Die letzte Zeile der Antwort ist, was Sie stattdessen schreiben sollten – dan

+0

Vielen Dank! –

0

Das Problem ist, dass Sie eine UIColor zu einem String zuweisen versuchen. Sie wollen textLabel stattdessen die textColor Eigenschaft auf der Zelle verwenden, etwa so:

cell.textLabel?.textColor = UIColor.darkTextColor() 

Beachten Sie auch, dass Sie eine wieder verwendbare Zellkennung Mismatch haben ("Cell" für neu diejenigen geschaffen, "cell" für sie zu holen).


Allerdings gibt es hier größere Probleme.

Sie sollten nicht über crash operators (!) littering, um Compilerfehler zu schließen. Sicher, es kann jetzt völlig "sicher" sein (wie Sie eine Überprüfung durchführen) - aber es ermutigt nur die zukünftige Verwendung von ihnen an Orten, wo sie wirklich nie verwendet werden sollten. Sie können auch für zukünftige Code-Refactorings ziemlich gefährlich sein.

Ich würde empfehlen, dass Sie Ihren Code neu schreiben, um den Nullkoaleszenzoperator zu nutzen (??). Sie können dies verwenden, um eine wiederverwendbare Zelle zu erhalten. Wenn das fehlschlägt, können Sie stattdessen in einem neu erstellten ersetzen. Sie können auch ein automatisch ausgeführtes Closure ({...}()) verwenden, um einige allgemeine Zellen einzurichten.

Zum Beispiel:

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

    // attempt to get a reusable cell – create one otherwise 
    let cell = tableView.dequeueReusableCellWithIdentifier("foo") ?? { 

     // create new cell 
     let cell = UITableViewCell(style: .Default, reuseIdentifier: "foo") 

     // do setup for common properties 
     cell.backgroundColor = UIColor.redColor() 
     cell.selectionStyle = .None 

     // assign the newly created cell to the cell property in the parent scope 
     return cell 
    }() 

    // do setup for individual cells 
    if indexPath.row % 2 == 0 { 
     cell.textLabel?.text = "foo" 
     cell.textLabel?.textColor = UIColor.blueColor() 
    } else { 
     cell.textLabel?.text = "bar" 
     cell.textLabel?.textColor = UIColor.greenColor() 
    } 

    return cell 
} 

Jetzt ist es leicht zu erkennen, ob ein ! in Ihrem Code gehört oder nicht. Es ... er tut es nicht.

Vertrauen Sie niemandem, der empfiehlt, Ihrem Code zusätzliche Crash-Operatoren hinzuzufügen, um Ihre Probleme zu lösen. Es wird nur eine Quelle für mehr Probleme.

Verwandte Themen