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