#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
что это не подходящее место для этого, так как оно будет вызываться для каждой строки в таблице и потенциально будет вызываться для каждой строки более одного раза.
Ответ №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
}