2016-07-02 10 views
1

SwiftのCore Dataを使用して検索したバーコードを使用して取得する方法を知りました。私は基本的にバーコードをstatic funcメソッドに渡していますが、それを使ってコアデータからデータをフェッチするにはどうしたらいいですか?検出されたときにここでswiftで文字列を取得する方法

はバーコードである:

func barcodeDetected(code: String) { 

    // Let the user know we've found something. 

    let alert = UIAlertController(title: "Found a Barcode!", message: code, preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "Search", style: UIAlertActionStyle.Destructive, handler: { action in 

     // Remove the spaces. 

     let trimmedCode = code.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 

     // EAN or UPC? 
     // Check for added "0" at beginning of code. 

     let trimmedCodeString = "\(trimmedCode)" 
     var trimmedCodeNoZero: String 

     if trimmedCodeString.hasPrefix("0") && trimmedCodeString.characters.count > 1 { 
      trimmedCodeNoZero = String(trimmedCodeString.characters.dropFirst()) 

      // Send the doctored barcode 
      ProductDetailsViewController.searchCode(trimmedCodeNoZero) 
     } else { 

      // Send the doctored barcode 
      ProductDetailsViewController.searchCode(trimmedCodeString) 

     } 

     self.navigationController?.popViewControllerAnimated(true) 
    })) 

    self.presentViewController(alert, animated: true, completion: nil) 
} 

マイプロダクトクラス:

import UIKit 
import Foundation 
import CoreData 


class ProductDetailsViewController: UIViewController, NSFetchedResultsControllerDelegate { 

    @IBOutlet weak var productLabel: UILabel! 
    @IBOutlet weak var priceLabel: UILabel! 

    @IBAction func addProduct(sender: AnyObject) { 
     let AppDel = UIApplication.sharedApplication().delegate as? AppDelegate 
     let context:NSManagedObjectContext = (AppDel?.managedObjectContext)! 

     let ent = NSEntityDescription.entityForName("Products", inManagedObjectContext: context) 

     var newProduct = ProductItem(entity: ent!, insertIntoManagedObjectContext: context) 
     newProduct.title = productLabel.text 
     //newProduct.price = priceLabel.text 

     /*context.save(nil) 
     print(newProduct) 
     print("Object Saved")*/ 

    } 

    private(set) var PRODUCT_NAME = "" 
    private(set) var PRODUCT_PRICE = "" 
    private var menuItems:[ProductItem] = [] 

    static func searchCode(codeNumber: String) -> String{ 

     let barcodeNumber = codeNumber 
     return barcodeNumber 

    } 
     deinit{ 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     productLabel.text = "Scan a Product" 
     priceLabel.text = "" 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "setLabels:", name: "ProductNotification", object: nil) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

} 

私はすでに正常コアデータにアイテムを追加し、私のテーブルにすべての項目を読み込むことができましたアプリ。バーコードがスキャンされたので、バーコードが付いた製品をロードするだけで、その部分に固執しています。あなたは私の静的な楽しみsearchCodeがbarcodeDetectedからバーコードを受信して​​いるのを見ることができますが、私はそれをフェッチするために次に何をすべきですか?ありがとう。

EDIT:

コアデータのエンティティ

import Foundation 
import CoreData 
@objc(ProductItem) 

class ProductItem: NSManagedObject{ 
    @NSManaged var barcodeNum:String? 
    @NSManaged var box_height:NSNumber? 
    @NSManaged var box_length:NSNumber? 
    @NSManaged var box_width:NSNumber? 
    @NSManaged var price:NSNumber? 
    @NSManaged var sku:String? 
    @NSManaged var weight:NSNumber? 
    @NSManaged var title:String? 


} 
+0

おかげさまで、ありがとう。 – CodingKid92

+0

エンティティの詳細を表示できますか?バーコードがどの属性に含まれるかははっきりしません。また、VCがあなたの最初のコードですか? CoreDataから関連オブジェクトを取得したら、何をしたいですか? – pbasdf

+0

Core Data Entityで編集しました。バーコードを含む属性はbarcodeNumです。また、barcodeNumオブジェクトが取得されると、バーコードに関連する他のすべての属性を表示できるようにしたいと考えています。しかし、私の問題は、バーコードがViewControllerからスキャンされ、ProductsViewControllerに渡されたときです。私は次に何をすべきかに固執しています。 @pbasdf – CodingKid92

答えて

0

正しいProductItemを取得するには、あなたが述語を(アップルのドキュメントhereを参照)を使用する必要があります。私は簡潔にするためtry!を使用しましたが、実際には、あなたが正しいdo ... catch構文を使用し、すべてのエラーを処理する必要があり

let AppDel = UIApplication.sharedApplication().delegate as? AppDelegate 
let context:NSManagedObjectContext = (AppDel?.managedObjectContext)! 
let fetchRequest = NSFetchRequest(entityName: "ProductItem") 
fetchRequest.predicate = NSPredicate(format: "barcodeNum == %@",codeNumber) 
let results = try! context.executeFetchRequest(fetchRequest) as! [ProductItem] 
if results.count > 0 { // great, you found (at least one) matching item 
    let scannedProduct = results[0] 
    // from here you can access the attributes of the product 
    // such as title, price, sku, etc. 
    ... 
} else { // not found 
    ... 
} 

注:あなたのケースでは、あなたはこのようなものを使用することができます。

ProductDetailsViewControllerで静的ファンクションを使用する理由がわかりません。一般的なアプローチは、barcodeDetectedメソッド内で上記のフェッチを使用してからProductDetailsViewControllerにセグをして、表示/編集などの目的でProductItemを渡します。また、製品が見つからなかった場合は警告表示を表示することもできます。

+0

ありがとうございました!これは非常に意味がありますが、コアデータを使用していない前に、.CSVファイル内のすべてをタプルの配列で保持していたため、静的な関数がある理由があります。しかし、私はこの@pbasdfをやっているので、Core Dataをまだ学んでいます – CodingKid92

関連する問題