2016-05-05 20 views
0

Ich bin neu in Codierung so nicht sicher, ob ich wie diesen Fehler zu beheben:Tableview Fehler Swift 2

private let cellReuseIdentifier = "ArticleViewCell" 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) as? UITableViewCell 

    if cell == nil { 
     cell = ArticleViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellReuseIdentifier) 
    } 

ich diesen Fehler:

Downcast from 'UITableViewCell?' to 'UITableView only warps optionals; did you mean to use "!"? 

Ich versuchte, die ?-! Put-Wechsel es wird auch ein Fehler angezeigt.

+0

Sehen Sie, was der Rückgabetyp von dequeue ist. – user1046037

Antwort

0

Versuchen:

let cell = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) as! <ClassName> 

Wo "Classname" ist der Name der Klasse für den Artikel Tableview Zelle.

+0

Sie wollen nicht das!, Das wird abstürzen, da 'dequeueCellWithReuseIdentifier' null zurückgeben kann. Sie müssen die Rücksendung mit bedingt auspacken? Die if-Anweisung behandelt dann den Null-Fall. Es ist wahrscheinlich besser, dass das op die Zellen mit dem Wiederverwendungsidentifikator klassifiziert und dann 'dequeueReusableCellWithIdentifier: forIndexPath' verwendet. – Paulw11

+0

Meiner Meinung nach ist es einer dieser seltenen Fälle, in denen ich ein'! '(Ja, es kann abstürzen) benutzen kann. 'cellForRowAtIndexPath' erfordert das Zurückgeben einer Zelle. Was passiert also, wenn Sie'? 'verwenden und ein Nil zurückgegeben wird. cellForRowAtIndexPath braucht nicht optional. Ich stimme zu, dass Sie die Zelle registrieren müssen. Sie müssen die Warteschlange nicht basierend auf dem Indexpfad aufheben, es sei denn, Sie möchten eine andere Zelle basierend auf dem Indexpfad. Sie können aus der Tabellenansicht entfernen – user1046037

+0

Dann sollten Sie Ihre Antwort klären und die Notwendigkeit, die Zellklasse zu registrieren. Wenn Sie sich auf den OP-Code beziehen, verwenden sie eindeutig die "alte" Zellenqueue, wobei "nil" zurückgegeben werden kann, und der nächste Schritt besteht darin, eine neue Zelle zuzuweisen, sodass Ihr Code * abstürzen wird, aber mit einem? es funktioniert einwandfrei – Paulw11

-1

Nachdem Sie die Zelle erstellt haben, sollten Sie ein "!" nachdem die Zelle wie zum Beispiel:

return cell! 
2

Versuchen

let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as! UITableViewCell 

Vergessen Sie auch nicht die Zelle zurückzukehren.

return cell 
+0

Dies funktioniert nur, wenn das OP die Zellklasse registriert hat (oder ein Storyboard verwendet, das die Zellklasse für sie registriert) – Paulw11

0

Sie brauchen nicht es zu auszupacken überhaupt:

var cell = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier)