首页 > 解决方案 > 使用模型向下载的 MySQL 数据添加局部变量

问题描述

我正在使用 MySQL 和 PHP 下载餐厅菜单,但应用程序的用户应该能够从他们想要的菜单中添加一定数量的项目。目前我正在使用步进器来指示数量并将该数量添加到 UserDefaults 键中,该键在再次下载菜单时被调用。当我转到另一个总结订单的视图控制器时,这使我不得不再次下载菜单,但我似乎无法只过滤掉那些确实有数量的项目。

有什么更好的方法可以将该数量添加到下载的数据中,以及如何在我的购物车 ViewController 中过滤这些项目以仅显示和使用具有数量的项目。

我当前的 downloadModel、MenuModel、cellViewController(用于菜单表视图)如下所示:

菜单下载.swift:

import UIKit

protocol MenuDownloadProtocol: class {
    func productsDownloaded(products: NSArray)
}

class MenuDownload: NSObject {

    //properties
    weak var delegate: MenuDownloadProtocol!
    

    func downloadProducts() {
        
 
        let urlPath = "http://server.com/download.php" // Fake URL obviously

        let url: URL = URL(string: urlPath)!
        let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
        
        let task = defaultSession.dataTask(with: url) { (data, response, error) in
            
            if error != nil {
                print("Failed to download data")
            }else {
                print("Menu downloaded")
                self.parseJSON(data!)
            }
            
        }
        
        task.resume()
    }

    func parseJSON(_ data:Data) {
        
        var jsonResult = NSArray()
        
        do{
            jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
            
        } catch let error as NSError {
            print(error)
            
        }
        
        var jsonElement = NSDictionary()
        let products = NSMutableArray()
        
        for i in 0 ..< jsonResult.count
        {
            
            jsonElement = jsonResult[i] as! NSDictionary
            
            let restomenu = MenuModel()
            
            //the following insures none of the JsonElement values are nil through optional binding
            if let product = jsonElement["product"] as? String,
                let price = jsonElement["price"] as? String,
                let info = jsonElement["info"] as? String,
                let imageurl = jsonElement["imageurl"] as? String
                
                
            {
                let productandprice = product + " " + "€&quot; + price
                let quantityy = UserDefaults.standard.object(forKey: productandprice) as? String
                    restomenu.product = product
                    restomenu.price = price
                    restomenu.info = info
                    restomenu.imageurl = imageurl
                    restomenu.quantity = quantityy
 
            }
            
            products.add(restomenu)
           
            
        }
        
        DispatchQueue.main.async(execute: { () -> Void in
            
            self.delegate.productsDownloaded(products: products)
            
        })
    }

}


extension String {
    func chopPrefix(_ count: Int = 1) -> String {
        return substring(from: index(startIndex, offsetBy: count))
    }

    func chopSuffix(_ count: Int = 1) -> String {
        return substring(to: index(endIndex, offsetBy: -count))
    }
}

MenuModel.swift:

import UIKit

class MenuModel: NSObject {

    //properties
    
    var product: String?
    var price: String?
    var info: String?
    var imageurl: String?
    var quantity: String?
   
    
    
    //empty constructor
    
    override init()
    {
        
    }
    
    
    
    init(product: String, price: String, info: String, imageurl: String, quantity: String) {
        
        self.product = product
        self.price = price
        self.info = info
        self.imageurl = imageurl
        self.quantity = quantity
        
        
    }
    
    
    //prints object's current state
    
    override var description: String {
        return "product: \(String(describing: product)), price: \(String(describing: price)), info: \(String(describing: info)), imageurl: \(String(describing: imageurl)), quantity: \(String(describing: quantity))"
        
    }
    
}

tableViewCell.swift:

import UIKit




class productTableViewCell: UITableViewCell {

    @IBOutlet weak var productLabel: UILabel!
    @IBOutlet weak var productImage: UIImageView!
    @IBOutlet weak var cellView: UIView!
    @IBOutlet weak var orderCount: UILabel!
    @IBOutlet weak var stepper: UIStepper!
       
    var amount: String?
    
    
    @IBAction func stepperValueChanged(_ sender: UIStepper) {
        
        amount = Int(sender.value).description
        orderCount.text = amount
  //      let defaultkey = String(productLabel.text!)
        UserDefaults.standard.setValue(amount, forKey: productLabel.text!)
        
        if amount == "0"
        
        {
            orderCount.isHidden = true
            UserDefaults.standard.removeObject(forKey: productLabel.text!)
        }
        else
        {
            orderCount.isHidden = false
        }
        
    }
    
  
 
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    
   
    
}

编辑:在尝试了过滤选项和许多不同的方法后,我仍然没有找到解决这个问题的方法。我觉得我想太多了。

标签: iosswift

解决方案


推荐阅读