Объединить один и тот же элемент основных данных из нескольких представлений таблиц в UIKit

Я добавил диаграмму ниже. На диаграмме вы видите класс, в котором вы сохраняете продукт. Вы щелкаете по ячейке таблицы и видите новый класс, в который вы помещаете предмет и сумму, необходимую для приготовления этого рецепта. Я хочу сделать это, когда вы нажмете на ячейку табличного представления во 2-м классе. Он выполняет поиск по всем рецептам, чтобы найти совокупное количество этого конкретного ингредиента. На схеме вы можете видеть, что я выделила яблоки. В ячейке tableview это должно быть, например, яблоко достигает 3,0, всего все 8,0.

import UIKit

class Ingriendentsx: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        specifcGame.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomOneTableViewCell
        
        if cell == nil {
            cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell") as? CustomOneTableViewCell
        }
        
        let expense = specifcGame[indexPath.row]
        
    
        
        
        
        
        cell?.textLabel?.text = "\(expense.name!) hits \(expense.amount)"
        
        return cell ?? UITableViewCell()
    }
    
    
    var txt = UITextField()
    var btn = UIButton()
    var tble = UITableView()
    var lbl = UILabel()
    var txt2 = UITextField()
    var backB = UIButton()
    
    
    
    var ingreidentsAndAmount = [Ingriendents]()
    
    var inital : Recipe?
    var placeholder = String()
    
    private var specifcGame : [Ingriendents] = []
    
    
    
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        if let budget = inital {
            lbl.text = budget.recipeName
            
            //
            
            if let aE = budget.ir?.allObjects as? [Ingriendents] {
                specifcGame = aE
            }
            
            
            
        }
        
        
        
        
        [txt,btn, tble, lbl, txt2, backB].forEach {
            view.addSubview($0)
            $0.translatesAutoresizingMaskIntoConstraints = false
            $0.layer.borderWidth = 1
            $0.backgroundColor = UIColor(
                red: .random(in: 0.5...0.7),
                green: .random(in: 0.0...1),
                blue: .random(in: 0.3...0.5),
                alpha: 1
            )
            
            $0.layer.borderWidth = 1
            
            if let textfield = $0 as? UITextField {
                
                textfield.textAlignment = .center
            }
            
            if let label = $0 as? UILabel {
                
                label.textAlignment = .center
            }
            if let button = $0 as? UIButton {
                button.setTitleColor(.black, for: .normal)
            }
            
        }//below
        NSLayoutConstraint.activate([
            
            lbl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            lbl.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.05, constant: 0),
            lbl.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1, constant: 0),
            lbl.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            
            
            
            txt.topAnchor.constraint(equalTo: lbl.bottomAnchor),
            txt.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.05, constant: 0),
            txt.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1, constant: 0),
            txt.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            
            txt2.topAnchor.constraint(equalTo: txt.bottomAnchor),
            txt2.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.05, constant: 0),
            txt2.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1, constant: 0),
            txt2.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            
            
            
            btn.topAnchor.constraint(equalTo: txt2.bottomAnchor),
            btn.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.10, constant: 0),
            btn.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1, constant: 0),
            btn.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            
            
            tble.topAnchor.constraint(equalTo: btn.bottomAnchor),
            tble.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.50, constant: 0),
            tble.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1, constant: 0),
            tble.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            
            backB.topAnchor.constraint(equalTo: tble.bottomAnchor),
            backB.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.10, constant: 0),
            backB.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1, constant: 0),
            backB.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            
            
        ])
        tble.delegate = self
        tble.dataSource = self
        
        btn.addTarget(self, action: #selector(pressA), for: .touchDown)
        tble.register(CustomOneTableViewCell.self, forCellReuseIdentifier: "Cell")
        
        backB.addTarget(self, action: #selector(backer), for: .touchDown)
    }
    
    @objc func pressA(){
        guard let name = txt.text else {
            return
        }
        
        
        
        guard let calorieText = txt2.text, let count = Double(calorieText) else {
            return
        }

        
        guard let budget = inital else {
            return
        }
        
        
        
        
        
        let expense = DataManager.shared.saveToAttempts(name: name, amount: count, inz: budget)
        
        
        
        specifcGame.append(expense)
        
        tble.reloadData()
        DataManager.shared.save()
        txt.text = ""
        txt2.text = ""
        

    }
    
    @objc func backer(){
        self.dismiss(animated: true)
    }
    

}

class CustomOneTableViewCell: UITableViewCell {
    
    
}

Мне кажется, вам нужно использовать NSFetchRequest с предикатом (NSPredicate), чтобы отфильтровать все ингредиенты, принадлежащие Apple. Затем вам нужно либо перебрать результат, чтобы получить сумму, либо более сложное решение, в котором вы используете NSExpression вместе с запросом на выборку, который автоматически вычислит сумму для вас.

Joakim Danielson 23.04.2024 09:50

@JoakimDanielson, можешь показать мне код?

Sam Burns 23.04.2024 17:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

func loadIngredients() имеет логику расчета общей суммы

class IngredientsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    struct IngredientDetail {
        let ingredient: Ingredient
        let totalAmount: Double
    }
    
    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var amount: UITextField!
    @IBOutlet weak var addButton: UIButton!
    @IBOutlet weak var tableView: UITableView!
    
    var recipe: Recipe!
    var ingredientsDetail: [IngredientDetail] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configureTableView()
        loadIngredients()
        navigationItem.title = recipe.recipeName
    }
    
    func configureTableView() {
        tableView.dataSource = self
        tableView.delegate = self
    }
    
    func loadIngredients() {
        let ingredientsFetchRequest = NSFetchRequest<Ingredient>(entityName: "Ingredient")
        
        if var fetchedAllIngredients = try? PersistenceController.shared.persistentContainer.viewContext.fetch(ingredientsFetchRequest) {
            
            // reset ingredientsDetail
            ingredientsDetail = []
            
            // filtering current recipe ingredients
            let recipeIngredients = fetchedAllIngredients.filter({ $0.recipe == recipe })
            
            for recipeIngredient in recipeIngredients {
                
                var totalAmount: Double = 0
                
                // name matching ingredients and calculating total amount
                // filtering to avoid rechecking matched ingredients
                fetchedAllIngredients = fetchedAllIngredients.filter({
                    if $0.name!.caseInsensitiveCompare(recipeIngredient.name!) == .orderedSame {
                        totalAmount += $0.amount
                        return false
                    }
                    return true
                })
                
                ingredientsDetail.append(
                    IngredientDetail(
                        ingredient: recipeIngredient,
                        totalAmount: totalAmount
                    )
                )
            }
            
        }
    }
    
    @IBAction func tappedAddIngredient() {
        if let ingredientName = name.text,
           !ingredientName.isEmpty,
           let amountText = amount.text,
           let amountDoubleValue = Double(amountText) {
            let ingredient = Ingredient(context: PersistenceController.shared.persistentContainer.viewContext)
            ingredient.name = ingredientName
            ingredient.amount = amountDoubleValue
            ingredient.recipe = recipe
            PersistenceController.shared.saveContext()
            loadIngredients()
            tableView.reloadData()
            name.text = ""
            amount.text = ""
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        ingredientsDetail.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
        var content = cell.defaultContentConfiguration()
        let ingredientDetail = ingredientsDetail[indexPath.row]
        if ingredientDetail.totalAmount > ingredientDetail.ingredient.amount {
            let attributedText = NSMutableAttributedString(string: "Name: \(ingredientDetail.ingredient.name!), Amount: \(ingredientDetail.ingredient.amount)")
            let boldAttributes: [NSAttributedString.Key: Any] = [.font: UIFont.systemFont(ofSize: 15, weight: .bold)]
            let totalAmount = NSAttributedString(string: ", Total Amount: \(ingredientDetail.totalAmount)", attributes: boldAttributes)
            attributedText.append(totalAmount)
            content.attributedText = attributedText
        } else {
            content.text = "Name: \(ingredientDetail.ingredient.name!), Amount: \(ingredientDetail.ingredient.amount)"
        }
        cell.contentConfiguration = content
        return cell
    }
}

Пожалуйста, не публикуйте ответы, содержащие только код. Хороший ответ объясняет, что было не так, и объясняет, как ответ решает проблему. Пожалуйста, обновите свой ответ, добавив соответствующее объяснение.

HangarRash 29.04.2024 18:35

получение ошибки «Невозможно найти PersistenceController» в области видимости

Sam Burns 30.04.2024 00:25

@SamBurns, пожалуйста, проверьте полный код здесь. github.com/immanaro2497/RecipeApp

Immanuel 30.04.2024 06:51

Другие вопросы по теме