Как получить общее количество ячеек нижнего колонтитула в разделах?

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

Я до сих пор не могу заставить его суммировать разные цены (Price1-3) для ячеек, в которых выбраны разные цены, переданные в него Раздел

код, который я использую для суммирования суммы в CartFooter для ячеек в разделах cartFooter.cartTotal.text = "\(String(cart.map{$0.cartItems.price1}.reduce(0.0, +)))"

РАНЕЕ:

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

Данные в CartVC заполняются из другого VC (HomeVC). Вот почему в CartCell есть 3 разных варианта цены, когда данные заполняют ячейки.

Просто застрял на том, как я мог бы получить общее количество в нижнем колонтитуле для ячеек в разделе

Добавление конкретных данных для каждого раздела в UITableView — Swift

Заранее спасибо, Ваша помощь очень ценится

введите здесь описание изображения

extension CartViewController: UITableViewDelegate, UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return brands
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let brand = brands[section]
        return groupedCartItems[brand]!.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cartCell = tableView.dequeueReusableCell(withIdentifier: "CartCell") as! CartCell

        let brand = brands[indexPath.section]
        let cartItemsToDisplay = groupedCartItems[brand]![indexPath.row]
        cartCell.configure(withCartItems: cartItemsToDisplay.cartItems)

        return cartCell
    }

     func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let cartHeader = tableView.dequeueReusableCell(withIdentifier: "CartHeader") as! CartHeader

        let headerTitle = brands[section]
        cartHeader.brandName.text = "Brand: \(headerTitle)"

    return cartHeader
    }

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
         let cartFooter = tableView.dequeueReusableCell(withIdentifier: "FooterCell") as! FooterCell
        let sectionTotal = cart[section].getSectionTotal()

        let calculate = String(cart.map{$0.cartItems.price1}.reduce(0.0, +))
        cartFooter.cartTotal.text = "$\(calculate)"

        return cartFooter
    }

}

Обновление: это результаты, которые я получаю, используя это в CartFooter.

let calculate = String(cart.map{$0.cart.price1}.reduce(0.0, +))
cartFooter.cartTotal.text = "$\(calculate)"

который вычисляет общую сумму (OT) для всех разделов и помещает OT во все ячейки нижнего колонтитула (как показано ниже ▼), когда я пытаюсь получить общую сумму для каждого раздела в своих нижних колонтитулах (как показано на изображении выше ▲ справа)

введите здесь описание изображения

Обновление 2:

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

    var totalSum: Float = 0

    for eachProduct in cartItems{
        productPricesArray.append(eachProduct.cartItem.price1)
        productPricesArray.append(eachProduct.cartItem.price2)
        productPricesArray.append(eachProduct.cartItem.price3)
        totalSum = productPricesArray.reduce(0, +)

        cartFooter.cartTotal.text = String(totalSum)
    }

person Evelyn    schedule 25.11.2019    source источник
comment
не могли бы вы поделиться кодом товара, пожалуйста?   -  person Andres Gomez    schedule 25.11.2019
comment
только что добавил класс предметов @AndresGomez   -  person Evelyn    schedule 26.11.2019
comment
Можешь перефразировать свой вопрос?   -  person DevesH    schedule 29.11.2019


Ответы (4)


@Evelyn Попробуйте расчет прямо в нижнем колонтитуле. Попробуйте код ниже.

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let cartFooter = tableView.dequeueReusableCell(withIdentifier: "FooterCell") as! FooterCell
    let brand = brands[indexPath.section]
    let arrAllItems = groupedCartItems[brand]!
    var total: Float = 0
    for item in arrAllItems {
        if item.selectedOption == 1 {
             total = total + Float(item.price1)
        } else item cartItems.selectedOption == 2 {
             total = total + Float(item.price2)
        } else if item.selectedOption == 3 {
             total = total + Float(item.price3)
        }
    }
    cartFooter.cartTotal.text = "$\(total)"
    return cartFooter
}
person VRAwesome    schedule 04.12.2019

Там много кода, и я не совсем уверен, в чем заключается ваша ошибка кодирования. При этом сказал:

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
     let cartFooter = tableView.dequeueReusableCell(withIdentifier: "FooterCell") as! FooterCell
    let sectionTotal = cart[section].getSectionTotal()

    let calculate = String(cart.map{$0.cart.price1}.reduce(0.0, +))
    cartFooter.cartTotal.text = "$\(calculate)"

    return cartFooter
}

Кажется, ваш код говорит, что let sectionTotal = cart[section].getSectionTotal() — это сумма, которую вы ищете (т. е. сумма в разделе), в то время как вы отображаете OT в разделе, суммируя String(cart.map{$0.cart.price1}.reduce(0.0, +)).

Другими словами, если cartFooter является контейнером, который будет отображать итог в разделе, вместо этого следует читать cartFooter.cartTotal.text = "$\(sectionTotal)", не так ли?

Если это не ответ, я предлагаю вам установить точку останова каждый раз, когда создается экземпляр нижнего колонтитула, и выяснить, почему он выводит то, что выводит (т.е. OT, а не общее количество разделов).

person Alex    schedule 30.11.2019
comment
Да, это Другими словами, если cartFooter — это контейнер, который будет отображать итог в разделе, вместо этого следует читать cartFooter.cartTotal.text = $(sectionTotal), нет? было бы лучшим способом заставить его работать, но до сих пор это не увенчалось успехом, что бы я ни делал - person Evelyn; 30.11.2019
comment
что произойдет, если вы замените cartFooter.cartTotal.text = "$\(calculate)" на cartFooter.cartTotal.text = "$\(sectionTotal)"? - person Alex; 30.11.2019
comment
Хорошо, я думаю, что постепенно понимаю проблему ... Ваша проблема в том, что выбор цены (1-3), похоже, не отражает общую цену в каждом разделе, верно? - person Alex; 30.11.2019
comment
когда я использую calculate, он показывает общую сумму, как показано на втором изображении, когда я использую sectionTotal, все результаты равны 0, как видно на первом изображении слева. Когда вы спросили Ваша проблема в том, что выбор цены (1-3), кажется, не отражает общую цену в каждом разделе правильно? это именно то, что я пытаюсь сделать - person Evelyn; 01.12.2019
comment
О боже... @Evelyn, твоя проблема не в дисплее, эта часть работает нормально. Ваша проблема связана с моделью и связана с тем, как она выполняет внутренние вычисления. В вашем вопросе слишком много информации, вся часть, относящаяся к TableView, не имеет никакого отношения к описанной вами проблеме. Очень, очень запутанно.... Для моей информации, правая часть верхнего первого изображения имеет правильную общую сумму, НО не будет показывать правильные цены (1-3), я прав? Если это так, то ваша проблема заключается в getSectionTotal(); Итак: 1/установить там точку останова 2/запустить и отладить, я подозреваю, что цена .... - person Alex; 01.12.2019
comment
... выбор не передается, поэтому код всегда запускает одну и ту же опцию. Кроме того, ваше имя сбивает с толку: глобальная корзина представляет собой набор экземпляров Cart, каждая корзина содержит атрибут «корзина», который представляет собой набор элементов??... это рецепт катастроф, потому что методы будут привязаны к классу имена, которые имеют разные роли, но одни и те же идентификаторы. Вы должны перепроектировать свой код модели, дать каждому классу уникальное имя, адекватно разделить их в соответствии с их ответственностью и создать все необходимые средства доступа таким образом, чтобы помочь вам заполнить ваш вид таблицы... - person Alex; 01.12.2019
comment
это, например, globalCart.total(), globalCart.confirm(), globalCart.checkout(), globalCart.ship.get/set(), globalCart.cancel(product indexPath:IndexPath), globalCart.get(корзина indexPath:IndexPath ) & set(...), globalCart.total(indexPath:IndexPath) и т. д... вместе со всеми наблюдателями KVO, чтобы при изменении раздела ваша модель обновлялась, а при обновлении модели (вне представления ), он уведомляет TableView. Взгляните на github.com/Dassine/ShoppingCart. Осторожно, есть много других примеров, которые НЕ должны быть реализованы. Удачи. - person Alex; 01.12.2019
comment
наконец, если вы действительно полны решимости учиться, поскольку девиз вашего профиля остается, вам следует взглянуть на udemy.com/course/pirate-bay-ios-swift-3-development-complete (я понятия не имею, хорошо это или нет) или что-то подобное. Разработка витрины магазина утомительна и требует большой строгости. Это чертовски больно *ss, но, к счастью, все ООП, необходимое для этого, уже где-то существует, так что не изобретайте велосипед :p и переделывайте существующий код под свои нужды. Если вы не используете повторно (не копируете) чужой код для этого, будьте уверены, что делаете это неправильно. - person Alex; 01.12.2019

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

let brand = brands[indexPath.section]
        let cartItemsToDisplay = groupedCartItems[brand]![indexPath.row]
        cartCell.configure(withCartItems: cartItemsToDisplay.cart)

внутри этого:

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
         let cartFooter = tableView.dequeueReusableCell(withIdentifier: "FooterCell") as! FooterCell
        let sectionTotal = cart[section].getSectionTotal()
        let brand = brands[section]
        let catrItemsToDisplay = // now you need to get associated items with this brand (cart)
    // I think it is can looks like this  =  cartItemsToDisplay[brand]
        let calculate = String(cartItemsToDisplay.cart.reduce(0.0, +))
        cartFooter.cartTotal.text = "$\(calculate)"

        return cartFooter
    }
person FindYourBalance    schedule 29.11.2019
comment
я получаю сообщение об ошибке let calculate = String(cartItemsToDisplay.cart.reduce(0.0, +)), говорящее Значение типа '[Корзина]?' не имеет корзины участников, и я сделал это, чтобы позволить cartItemsToDisplay = groupedCartItems[brand] в представленииForFooterInSection. Как мне получить код для расчета суммы для ячеек в разделе, я обновлю свой код через несколько секунд, чтобы показать, как все работает прямо сейчас - person Evelyn; 29.11.2019
comment
Удалить корзину перед уменьшением - person FindYourBalance; 30.11.2019

Измените структуру модели и способ установки значений с помощью TableViewDelegate. Давая краткую подсказку. Пожалуйста, посмотрите, поможет ли это:

class Cart {
   var brandWiseProducts: [BrandWiseProductDetails]!

   init() {
       brandWiseProducts = [BrandWiseProductDetails]()
   }

   initWIthProducts(productList : [BrandWiseProductDetails]) {
       self.brandWiseProducts = productList 
   }    
}



class BrandWiseProductDetails {
      var brandName: String!
      var selectedItems: [Items] 
      var totalAmount: Double or anything
}

class SelectedItem {
     var image
     var name
     var price
}


  Sections:

  Cart.brandWiseProducts.count

  SectionTitle:

  Cart.brandWiseProducts[indexPath.section].brandName

  Rows in section

  Cart.brandWiseProduct[indexPath.section].selectedItem[IndexPath.row]

  Footer:

  Cart.brandWiseProduct.totalAmount
person Akshay Jadhav    schedule 04.12.2019