如何在swift中使用字符串获取

Posted

技术标签:

【中文标题】如何在swift中使用字符串获取【英文标题】:How to fetch using string in swift 【发布时间】:2016-07-02 21:15:33 【问题描述】:

我只是想知道如何在 Swift 中使用搜索到的条形码来获取 Core Data。我基本上是将条形码传递给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()
       


我已经成功地将项目添加到 Core Data 中,并且能够将所有项目加载到我的应用程序的表中。现在扫描条码后,我希望能够加载带有条码的产品,但我被困在那个部分。如您所见,我的静态有趣的 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?



【问题讨论】:

有什么帮助吗?将不胜感激,谢谢。 您能否显示您的实体的详细信息 - 不清楚哪个属性将包含条形码。还要澄清视图控制器层次结构 - 您的第一个代码是哪个 VC?从 CoreData 获取相关对象后,您想做什么? 我用我的核心数据实体编辑了它。包含条形码的属性是barcodeNum。此外,一旦获取了barcodeNum 对象,我希望能够显示与条形码相关的所有其他属性。但我的问题是,一旦从我的 ViewController 扫描条形码并将其传递给我的 ProductsViewController,我就会陷入下一步该做什么的困境。 @pbasdf 【参考方案1】:

要获取正确的ProductItem,您需要使用谓词(请参阅Apple 文档here)。在你的情况下,你可以使用这样的东西:

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

请注意,为了简洁起见,我使用了try!,但实际上您应该使用正确的do ... catch 语法并处理任何错误。

我不清楚你为什么在ProductDetailsViewController 中使用静态函数;一种常见的方法是在您的barcodeDetected 方法中使用上述提取,然后通过相关的ProductItem 继续使用ProductDetailsViewController 以进行显示/编辑或其他操作。或者在未找到产品时显示警报视图。

【讨论】:

非常感谢!这很有意义,但是我有一个静态函数的原因是因为在我没有使用 Core Data 之前,我的 .CSV 文件中的所有内容都在一个元组数组中。但是我仍然在学习 Core Data,因为我这样做了@pbasdf

以上是关于如何在swift中使用字符串获取的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何在 plist 中获取第一个数组字符串?

如何在 swift3 中获取 CNLabeledValue 的本地化字符串

如何在 Swift 中获取字符串的子字符串? [复制]

Swift:如何获取某个字符之前的字符串?

如何获取保存的字符串并在 swift 中使用另一个视图控制器? [复制]

如何从字符串 Swift 3 中获取 ALAssetURL?