2016-07-02 2 views
1

검색 한 바코드를 사용하여 Swift에서 핵심 데이터를 가져 오는 방법은 궁금합니다. 기본적으로 바코드를 static func 메서드에 전달하고 있는데 어떻게 핵심 데이터에서 데이터를 가져올 수 있습니까? 여기 신속한 문자열 사용 방법

검출 바코드입니다 :

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에서 바코드를 수신하고 있음을 볼 수 있겠지만 다음에 가져와야하는 것은 무엇입니까? 감사.

편집 :

코어 데이터 엔터티

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!를 사용했습니다

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

참고하지만, 실제로 당신은 적절한 do ... catch 구문을 사용하여 오류를 처리해야합니다.

ProductDetailsViewController에서 정적 기능을 사용하는 이유가 명확하지 않습니다. 일반적인 접근법은 위의 가져 오기를 barcodeDetected 메소드에서 사용한 다음 ProductDetailsViewController으로 이동하여 표시/수정 또는 기타 관련 ProductItem을 전달하는 것입니다. 또는 제품을 찾을 수없는 경우 경고보기를 표시 할 수 있습니다.

+0

정말 고마워요! 이것은 매우 합리적입니다.하지만 정적 데이터를 사용하는 이유는 코어 데이터를 사용하지 않고 튜플 배열에있는 .CSV 파일의 모든 데이터를 가지고 있기 때문입니다. 그러나 나는이 @pbasdf를 할 때 Core Data를 배우고있다. – CodingKid92