2016-07-02 1 views
1

Je me demandais juste comment je serais capable d'utiliser un code à barres recherché pour aller chercher des données de base dans Swift. Je passe essentiellement un code à barres à une méthode static func, mais comment pourrais-je l'utiliser pour extraire les données à partir des données de base?Comment chercher en utilisant la chaîne dans swift

Voici le code à barres lorsque détecté:

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

ma classe de produit:

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

} 

je l'ai déjà ajouté les éléments dans succès Core Data et a été en mesure de charger tous les éléments dans une table dans mon app. Maintenant, avec le code à barres scanné, je veux être en mesure de charger les produits avec le code à barres et je suis coincé sur cette partie. Comme vous pouvez le voir, mon code de recherche est le code à barres de code à barres, mais que dois-je faire pour le récupérer? Merci.

EDIT:

Core Data Entity

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

Toute aide à quelqu'un? Serait reconnaissant, merci. – CodingKid92

+0

Pouvez-vous afficher les détails de votre entité? L'attribut qui contient le code à barres n'est pas clair. Clarifiez également la hiérarchie du contrôleur de vue - quel VC est votre premier code? Et que voulez-vous faire une fois que vous avez récupéré l'objet concerné à partir de CoreData? – pbasdf

+0

Je l'ai édité avec mon Core Data Entity. L'attribut qui contient le code à barres est barcodeNum. De plus, une fois que l'objet barcodeNum est extrait, je veux pouvoir afficher tous les autres attributs liés au code à barres. Mais mon problème est une fois que le code à barres est scanné à partir de mon ViewController et transmis à mon ProductsViewController, je suis coincé sur ce qu'il faut faire ensuite. @pbasdf – CodingKid92

Répondre

0

Pour récupérer la ProductItem correcte, vous devez utiliser un prédicat (voir Apple Documentation here). Dans votre cas, vous pouvez utiliser quelque chose comme ceci:

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

Notez que j'ai utiliser try! par souci de concision, mais dans la pratique, vous devez utiliser la syntaxe appropriée do ... catch et gérer les erreurs. Je ne comprends pas pourquoi vous utilisez une fonction statique dans ProductDetailsViewController; une approche courante serait d'utiliser la récupération ci-dessus dans votre méthode barcodeDetected, puis de se connecter au ProductDetailsViewController en passant le ProductItem correspondant pour l'affichage/édition ou autre. Ou pour afficher une vue d'alerte si le produit n'a pas été trouvé.

+0

Merci beaucoup! Cela a tellement de sens, mais la raison pour laquelle j'ai eu une fonction statique est parce qu'avant je n'utilisais pas les données de base et avais tout dans mon fichier .CSV dans un tableau de tuples. Mais j'apprends toujours les données de base comme je le fais @pbasdf – CodingKid92