2016-08-08 5 views
1

テーブルビューを上にスクロールしようとするとこのクラッシュが発生します。私の配列はnilではありません。スクロールアップしようとするたびにクラッシュするのはなぜですか?私はコアデータからデータを表示しようとしています。ここでスウィフトでスクロールアップするとUITableviewがクラッシュする

は私のコードです:

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] 

**それはここにクラッシュし、私は私のテーブルビューをスクロールアップしようとするたびに

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 { 

} 

製品+ 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

あなたがクラッシュログを追加することはできますか? –

+0

@ArnaudChrist私は上部のスクリーンショットで編集しました。plsは外見 – bobo

答えて

0

あなたはあなたの製品を取得する前に、配列のサイズをチェックし、値が辞書に存在することを確認するために結合(if letを)オプションを使用する必要があります

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 
    } 
} 

安全なコードを書くこと可能であれば、力のアンラッピングを避けることをお勧めします。この場合

、あなたのモデルのProductクラスを持っていることを考えると、あなたは[Product]としてあなたのプロダクトを格納する必要があり、あなたはその後、valueForKeyの使用を避けることができます。

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

がクラッシュしました。名前=(文字列)はデータを読み取れません – bobo

+0

'Product'クラスを持っているときになぜ' valueForKey'を使用していますか?モデルオブジェクトのプロパティにアクセスできませんか? –

+0

私はどのようにそれを行う方法を表示することができますかわからない? – bobo

関連する問題