Обрабатывать элементы из нескольких ViewController

#arrays #swift #uitableview #swiftui #swift5

#массивы #swift #uitableview #swiftui #swift5

Вопрос:

Привет, я пытаюсь создать приложение для заказа еды, но я столкнулся с проблемой, которая заключается в том, что я хочу отделить cartTableViewController для нескольких ViewController. я не знаю, как это объяснить, потому что мой английский очень плохой, но я постараюсь сделать все возможное, чтобы объяснить это … я имею в виду, допустим, что пользователь добавил элементы из burgerKingViewController в cartTableViewController, и он переходит к mcdonaldsViewController для добавления элементов в cartTableViewController,, здесь я хочупокажите пользователю предупреждение о том, что у него в корзине есть товары из burgerKingViewController, и он должен удалить его, чтобы он мог добавлять элементы из mcdonaldsViewController

чтобы упростить это еще больше.. я хочу, чтобы cartTableViewController обрабатывал только один ресторан, чтобы я мог принять заказ из firebase.

Спасибо.

это код, который я использую для добавления элемента в cartTableViewController

 import UIKit

struct userData {
static var selectedItem: Item? = nil
static var selectedItems: [Item] = []



static func selectedItemsPrice() -> Double {
    var result: Double = 0
    for item in selectedItems {
        result = result   item.price
    }
    return result
 }

 static func allItemsToString() -> String {
    var allNames: [String] = []
    for item in selectedItems {
        allNames.append(item.name)
    }
    return allNames.joined(separator: ", ")
  }



  }


struct Item: Equatable {

static let items : [Item] = {
    let food: Item = .init(image: UIImage(named: “food”)!, name: “food, price: 50)
    return [food]
  }()
var image: UIImage?
var name: String
var price: Double

  }
  

это cartTableViewController

  import UIKit


 class cartTableViewController: UITableViewController {

 @IBOutlet var checkOutPressed: UIButton!
 @IBOutlet var priceLabel: UILabel!
 @IBOutlet var cartView: UIView!
 @IBOutlet var totalOrder: UILabel!
 @IBOutlet var cartTableView: UITableView!


 override func viewDidLoad() {
    
    super.viewDidLoad()
    
    overrideUserInterfaceStyle = .light
    
    checkOutPressed.layer.cornerRadius = 4.0
    
  }



  override func viewWillAppear(_ animated: Bool) {
    
    priceLabel.text = "(userData.selectedItemsPrice())"
    totalOrder.text = "(userData.allItemsToString())"
    
    
    
    
    super.viewWillAppear(animated)

  }


  override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
  }

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int)   -> Int {
    // #warning Incomplete implementation, return the number of rows
    
    
    
    
    
    return userData.selectedItems.count
    
    
    
}



override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    105
}







override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cartCell") as! cartTableViewCell
    
    
    
    
    
    
    
    cell.cartImage.layer.masksToBounds = true
    cell.cartImage.layer.cornerRadius = 8
    cell.cartImage.translatesAutoresizingMaskIntoConstraints = false
    cell.cartImage.contentMode = .scaleAspectFill
    cell.cartLabel.textColor = .black
    cell.cartLabel.translatesAutoresizingMaskIntoConstraints = false
    cell.selectionStyle = .none
    
    
    
    
    let cart = userData.selectedItems[indexPath.row]
    
   
    cell.cartImage.image = cart.image
    cell.cartLabel.text = cart.name
    cell.priceLabel1.text = “(cart.price)"
    

    return cell


}







// Override to support conditional editing of the table view.
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    // Return false if you do not want the specified item to be editable.
    return true
}



// Override to support editing the table view.




// Override to support rearranging the table view.
override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {
    
}



// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    // Return false if you do not want the item to be re-orderable.
    return true
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    
    
    
    
    
    
}

// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}


override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    
    if editingStyle == .delete {
        
        // remove the item from the data model
        userData.selectedItems.remove(at: indexPath.row)
        // delete the table view row
        tableView.deleteRows(at: [indexPath], with: .fade)
        priceLabel.text = "(userData.selectedItemsPrice())"
        totalOrder.text = "(userData.allItemsToString())"
        
        
        
        
    } else if editingStyle == .insert {
        // Not used in our example, but if you were adding a new row, this is where you would do it.
        
    }
}



@IBAction func checkOutPressed(_ sender: UIButton) {
    
    
    
    if priceLabel.text! == "" || totalOrder.text! == "" {
        
        // Alert
        let optionMenu = UIAlertController(title: nil, message: “please add item”, preferredStyle: .alert)
        
        // Add actions to the menu
        let cancelAction = UIAlertAction(title: "OK", style: .cancel, handler:
                                            nil)
        optionMenu.addAction(cancelAction)
        
        // Display the menu
        self.present(optionMenu, animated: true, completion: nil)
        
        
        
        
        
        
    }
    
    
    
}


}
  

это burgerKingViewController

  import UIKit

 class burgerKingViewController: UIViewController {


@IBOutlet var burgerKingImage: UIImageView!
@IBOutlet var burgerKingName: UILabel!
@IBOutlet var burgerKingPrice: UILabel!
@IBOutlet var makeOrder: UIButton!

override func viewDidLoad() {
    
super.viewDidLoad()
    
    overrideUserInterfaceStyle = .light
    makeOrder.layer.cornerRadius = 4.0



  }




@IBAction func makeOrder(_ sender: UIButton) {
    
    
    
    let alert = UIAlertController(title: "", message: “done”, preferredStyle: .alert)
    self.present(alert, animated: true, completion: nil)
    
    let when = DispatchTime.now()   1
    DispatchQueue.main.asyncAfter(deadline: when) {
        // your code with delay
        alert.dismiss(animated: true, completion: nil)
    }
    
    
    userData.selectedItems.append(Item(image: UIImage(named: “burgerKing”), name: “burgerKing”, price: Double(10.000)))
    
    
    
    
    self.aimateView(sender)
    
    
    
    
}




fileprivate func aimateView( _ viewToAnimate:UIView) {
    
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 2, options: .curveEaseIn, animations: {
        
        viewToAnimate.transform = CGAffineTransform(scaleX: 0.92, y: 0.92)
        
        
        
    }) { (_) in
        
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 2, options: .curveEaseIn, animations: {
            
            viewToAnimate.transform = CGAffineTransform(scaleX: 1, y: 1)
            
        }, completion: nil)
    }
   }






}
  

и это mcdonaldsViewController

 import UIKit

class mcdonaldsViewController: UIViewController {


@IBOutlet var mcdonaldsImage: UIImageView!
@IBOutlet var mcdonaldsName: UILabel!
@IBOutlet var mcdonaldsPrice: UILabel!
@IBOutlet var makeOrder: UIButton!

override func viewDidLoad() {
    
    
    super.viewDidLoad()
    overrideUserInterfaceStyle = .light
    
    makeOrder.layer.cornerRadius = 4.0

 }





@IBAction func makeOrder(_ sender: UIButton) {
    
    
    
    let alert = UIAlertController(title: "", message: “done”, preferredStyle: .alert)
    self.present(alert, animated: true, completion: nil)
    
    // change to desired number of seconds (in this case 5 seconds)
    let when = DispatchTime.now()   1
    DispatchQueue.main.asyncAfter(deadline: when) {
        // your code with delay
        alert.dismiss(animated: true, completion: nil)
    }
    
    
    
    userData.selectedItems.append(Item(image: UIImage(named: "mcdonalds"), name: "mcdonalds", price: Double(10.000)))
    
    
    
    
    self.aimateView(sender)
    
    
    
    
}




fileprivate func aimateView( _ viewToAnimate:UIView) {
    
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 2, options: .curveEaseIn, animations: {
        
        viewToAnimate.transform = CGAffineTransform(scaleX: 0.92, y: 0.92)
        
        
        
    }) { (_) in
        
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 2, options: .curveEaseIn, animations: {
            
            viewToAnimate.transform = CGAffineTransform(scaleX: 1, y: 1)
            
        }, completion: nil)
    }
}






}
  

Комментарии:

1. Слишком много… не могли бы вы предоставить минимальный воспроизводимый пример, который описывает проблему?

2. @Asperi Я хочу, чтобы cartTableViewController обрабатывал только один ресторан, чтобы я мог принять заказ из firebase.