2016-08-08 21 views
1

ab Ich habe diesen Absturz beim Versuch, meine Tabellenansicht nach oben zu scrollen. Mein Array ist nicht Null. Warum stürzt es jedes Mal ab, wenn ich versuche, nach oben zu scrollen? Ich versuche Daten von Core Data anzuzeigen.UITableview stürzt beim Scrollen in Swift

Hier ist mein Code:

var product = [NSManagedObject]() 

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

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

    let item = product[indexPath.row] 

** Es stürzt hier, jedes Mal wenn ich versuche, meine Tabellenansicht

cell.productTitle.text = item.valueForKey("name") as! String 
    cell.productDescription.text = item.valueForKey("size") as! String 

    return cell 

} 

func fetch() { 
    let moc = DataController().managedObjectContext 
    let productFetch = NSFetchRequest(entityName: "Product") 

    do { 
     let fetchedResults: [NSManagedObject] = try moc.executeFetchRequest(productFetch) as! [Product] 
     if let results: [NSManagedObject] = fetchedResults { 

      product = results 
      print("results:\(results.count)") 
     } 
    } catch let error as NSError { 
     print("Error: \(error.localizedDescription)") 
    } 
} 

Product.swift

import Foundation 
import CoreData 


class Product: NSManagedObject { 

} 

Produkt, um nach oben + CoreDataProperties.swift

import Foundation 
import CoreData 

extension Product { 

@NSManaged var id: String? 
@NSManaged var name: String? 
@NSManaged var img: String? 
@NSManaged var quantity: String? 
@NSManaged var size: String? 
@NSManaged var price: String? 
@NSManaged var promo: String? 

} 

Crash Screenshot

+0

Können Sie die Absturzprotokolle hinzufügen? –

+0

@ArnaudChrist Ich bearbeitet mit Screenshot oben, pls gucke – bobo

Antwort

0

Sie sollten die Größe des Arrays überprüfen, bevor Ihr Produkt, und verwenden Sie optionale Bindung (if let) zu prüfen, ob der Wert im Wörterbuch vorhanden ist:

if indexPath.row < product.count { 
    let item = product[indexPath.row] 
    if let name = item.valueForKey("name") as? String { 
     cell.productTitle.text = name 
    } 
    if let size = item.valueForKey("size") as? String { 
     cell.productDescription.text = size 
    } 
} 

Um sicheren Code zu schreiben Es ist eine gute Idee, das Auspacken der Kraft zu vermeiden, wenn dies möglich ist.

In diesem Fall gegeben, dass Sie eine Product Klasse für Ihr Modell haben, sollten Sie Ihre Produkte als [Product] speichern, können Sie dann vermeiden valueForKey mit:

if indexPath.row < product.count { 
    let item = product[indexPath.row] 
    if let name = item.name as? String { 
     cell.productTitle.text = name 
    } 
    if let size = item.size as? String { 
     cell.productDescription.text = size 
    } 
} 
+0

es stürzt ab, name = (string) kann nicht lesen – bobo

+0

Warum verwenden Sie 'valueForKey', wenn Sie eine' Produkt' Klasse haben? Können Sie nicht einfach auf Ihre Eigenschaft auf Ihrem Modellobjekt zugreifen? –

+0

ich weiß nicht wie, kann mir zeigen, wie es geht? – bobo

Verwandte Themen