Попытка рассчитать цену продукта в контроллере Swift3 Tableview

#ios #swift #swift3

#iOS #swift #swift3

Вопрос:

Я пытаюсь рассчитать общую стоимость продукта для всех продуктов. Итак, я могу получить общее количество, но оно генерирует массив выходных данных. Но мне нужна только итоговая сумма.

Это мой репозиторий git: [(github.com/sulkytejas/shopping-cart )]

код:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    
  let cell = tableView.dequeueReusableCell(withIdentifier: "cartCell", for: indexPath)
  let order = orders?[indexPath.row]
  let prices = [order?.product?.price]    
  print("in table view")
  for price in prices  {
    total  = Double(price!)
  }     
  print (total)
  cell.textLabel?.text = order?.product?.name
  return cell
}
  

Вывод :

  in table view
1810636.0
in table view
1810676.0
in table view
1810766.0
in table view
1810806.0
in table view
1810821.0
in table view
1810911.0
in table view
1810951.0
  

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

1. Вам нужно общее количество всех заказов в таблице или всех продуктов в каждом заказе? (т.Е. Один общий итог или один итог за строку)? Я думаю, вам нужно первое, так cellForRowAt что это не подходящее место для этого, так как оно будет вызываться для каждой строки в таблице и потенциально будет вызываться для каждой строки более одного раза.

2. github.com/sulkytejas/image-cart

Ответ №1:

Вам необходимо изменить функцию readOrdersFromArchive в файле orders.swift. Если у вас нет истории заказов, эта функция всегда возвращает нулевое значение. Вот почему вы не можете добавить какой-либо заказ в массив orders в вашей функции addToCartPressed.

 class func readOrdersFromArchive() -> [Order]? 
{
    return NSKeyedUnarchiver.unarchiveObject(withFile: archiveFilePath()) as? [Order] ?? [Order]()
}
  

Я смог увидеть общее значение после добавления кода ниже.

 var total = 0.0


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    orders = Orders.readOrdersFromArchive()

    if let orders = orders {

       for order in orders  {

          total  = (order.product?.price!)!

          }
       }

       print(total)

 }
  

Я только что переместил цикл for из cellForRowAtIndexPath в viewWillAppear. Это неподходящее место для вычисления общего значения, потому что оно вызывается каждый раз, когда tableview настраивает свою ячейку.

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

1. Я использую seque для передачи данных. Я объявил total в классе контроллера просмотра корзины и попытался выполнить добавление в tableview для функции ячейки.

2. Добавление действительно работает, но оно выдает несколько выходных данных. Мне просто нужен конечный результат. Я попытался загрузить вывод из View didl load, но он не отображается в консоли. это дает пустой вывод

3. Имеет ли cartVC массив заказов в качестве локальной переменной? Не могли бы вы распечатать переданное значение объекта после выбора продукта в ProductVC? Как насчет ввода кода в функцию viewWillAppear?

4. Общая сумма является локальной переменной, цены вызываются из ProductViewController.

5. Итак, я попытался распечатать его из viewWillApprear, и после отладки я увидел, что значения передаются, но они по-прежнему не выводятся на консоль?

Ответ №2:

 let prices = [order?.product?.price]
  

Что здесь происходит? Похоже, что в заказе есть только один продукт? И вы переносите цену этого одного продукта в массив, в результате чего получается массив с одной ценой?

Я понятия не имею, какой у вас здесь интерфейс, но, похоже, вы хотите чего-то большего:

 let prices = order.products.map() { $0.price }
  

Это позволило бы получить все продукты в виде массива, а затем создать новый массив с ценой каждого продукта.

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

1. На данный момент у меня есть 4 продукта, и у каждого продукта есть атрибут объекта с именем product.price.

2. На данный момент у меня есть 4 продукта, и у каждого продукта есть атрибут объекта с именем product.price. Итак, в ProductViewController есть кнопка AddToCart. При нажатии этой кнопки объект product отправляется в cartViewController. Где я пытаюсь добавить все product.price, чтобы получить общую цену.

Ответ №3:

Ваш массив выходных данных получен из вашего кода, выполняемого для каждой ячейки, которая у вас есть в представлении таблицы, которая из вашего вывода кажется равной 7.

Если вы хотите вывести только итоговую сумму, вам нужно вызвать

print (total)

вне tableView() функции. Идеальное место было бы в viewDidLoad() функции.

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

1. Я попробовал загрузить из viewDidLoad и viewWillApprear, но это не сработало

2. где бы вы ни создавали свой orders объект, вы должны поместить свой цикл for-in и print() оператор

3. Сделал это.. Это мой репозиторий git: [ссылка(github.com/sulkytejas/shopping-cart )]… Если вы можете взглянуть

Ответ №4:

Итоговое значение должно вычисляться вне делегатов tableview, потому что, как упоминалось @Paulw11, оно будет вызываться для каждой строки каждый раз, когда вы прокручиваете или просматриваете tableview. Лучшим вариантом было бы создать метод для вычисления общей суммы в самой модели или в расширении модели, из которой вы заполняете таблицу.

Какой тип orders данных здесь?

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

1. Тип данных заказа — массив

2. Какой результат будет при попытке распечатать общее количество внутри viewWillAppear

3. Да, поэтому я заполняю таблицу в CartViewController, но действие добавления к продукту выполняется в ProductVC

4. Результат равен 1,0 1,0 в табличном представлении 3001,0 в табличном представлении 6001,0 в табличном представлении 906001,0 в табличном представлении 1806001,0

5. Я поделился своим репозиторием на github, если вы можете взглянуть

Ответ №5:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    
  let cell = tableView.dequeueReusableCell(withIdentifier: "cartCell", for: indexPath)
  let order = orders?[indexPath.row]
  let prices = [order?.product?.price]    
  let localTotal:Double = 0.0    

  print("in table view")
  for price in prices  {
    localTotal  = Double(price!)
  }     
  print (localTotal)
 total = localTotal
  print (total)
  cell.textLabel?.text = order?.product?.name
  return cell
}