Как настроить модель данных для категории / подкатегории Swift - PullRequest
0 голосов
/ 04 августа 2020

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

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

Вот моя текущая модель данных:

import UIKit

struct Category {
    
    var name: String
    var color: UIColor
    var amountBudgeted: Double
    var subCategories: [SubCategory]
    
}

struct SubCategory {
    var name: String
    var amountBudgeted: Double
}

let categories = [
    Category(
        name: "Income",
        color: UIColor(rgb: Constants.green),
        amountBudgeted: 0.00,
        subCategories: [
            SubCategory(name: "Paycheck", amountBudgeted: 0.00),
            SubCategory(name: "Bonus", amountBudgeted: 0.00),
            SubCategory(name: "Dividend", amountBudgeted: 0.00),
            SubCategory(name: "Rental Income", amountBudgeted: 0.00),
    ]),
    Category(
        name: "Housing",
        color: UIColor(rgb: Constants.grey),
        amountBudgeted: 0.00,
        subCategories: [
            SubCategory(name: "Mortgage", amountBudgeted: 0.00),
            SubCategory(name: "Property Tax", amountBudgeted: 0.00),
            SubCategory(name: "HOA Fees", amountBudgeted: 0.00),
            SubCategory(name: "Household Repairs", amountBudgeted: 0.00),
    ]),
    Category(
        name: "Transportation",
        color: UIColor(rgb: Constants.red),
        amountBudgeted: 0.00,
        subCategories: [
            SubCategory(name: "Car Payment", amountBudgeted: 0.00),
            SubCategory(name: "Gas", amountBudgeted: 0.00),
            SubCategory(name: "Car Repairs", amountBudgeted: 0.00),
            SubCategory(name: "Registration", amountBudgeted: 0.00),
    ]),
    Category(
        name: "Food",
        color: UIColor(rgb: Constants.yellow),
        amountBudgeted: 0.00,
        subCategories: [
            SubCategory(name: "Groceries", amountBudgeted: 0.00),
            SubCategory(name: "Restaurants", amountBudgeted: 0.00),
    ]),
]

Я могу легко вызвать свойства основной категории в cellForItemAt как cell.nameLabel.text = categories[indexPath.item].name, но я не могу заставить работать представление подкатегории.

Я пытаюсь cell.nameLabel.text = categories[indexPath.item].subCategories[indexPath.item].name, но это не работает должным образом.

Мне также нужно выяснить, как связать данные между контроллерами представления, но это может потребоваться отдельная вопрос.

Нужно ли мне переосмыслить мою модель данных? Или мне нужно настроить метод cellForItemAt по-другому?

Спасибо.

1 Ответ

0 голосов
/ 04 августа 2020

Вот как я смог это сделать.

В контроллере представления основной категории:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        
        if let vc = storyboard?.instantiateViewController(identifier: "SubVC") as? SubVC {
            
            vc.subCategories = categories[indexPath.item].subCategories
            navigationController?.pushViewController(vc, animated: true)

        }
    }

В контроллере представления подкатегории:

    var subCategories: [SubCategory] = []

override func viewDidLoad() {
        super.viewDidLoad()
        
        collectionView.dataSource = self
        collectionView.delegate = self
    }

extension SubVC: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return subCategories.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SubCell", for: indexPath) as! SubCell
        
        cell.nameLabel.text = subCategories[indexPath.item].name
        cell.amountField.text = String(subCategories[indexPath.item].amountBudgeted)
        
        return cell
    }
    
}

Спасибо тем, кто прокомментировал этот вопрос.

Вот видео, которое также помогло мне в этом: https://www.youtube.com/watch?v=dc5kLyAn6dg

Надеюсь, это поможет новичку, как я, в будущее.

...