0

I am trying to add rows to a view as the user presses the add button. There are two buttons. One which adds a card and one which adds an expense inside the card. Im confident I have the code working to add cards but when I try to add an Expense inside a card it adds expenses to every card that is shown. How can I make it so that when the user presses the add expense button only the expense rows are added to the one card.

I have two structs one for Card and one for Expense, that I am using to store data.

struct Card: Identifiable {
    var id = UUID()
    var title: String
    var expenses: [Expense]
    
}

struct Expense: Identifiable {
    
    var id = UUID()
    var expenseType: String
    var amount: Double = 0.0
}

ContentView()

struct ContentView: View {
    
    @State private var cards = [Card]()
    @State private var expense = [Expense]()

    var title = ""
    var expenseType = ""
    var amount: Double = 0.0

    var body: some View {
        NavigationStack {
            Form {
                List {
                    
                    Button("Add card") {
                        addCard()
                    }
                    ForEach($cards) { a in
                        Section {
                            TextField("Title", text: a.title)
                            
                            Button("Add expense") {
                                addExpenses()
                            }
                            ForEach($expense) { b in
                                TextField("my expense", text: b.expensetype)
                                TextField("amount", value: b.amount, format: .number)
                            }
                        }
                    }
                }
            }
        }
    }
    func addCard() {
        cards.append(Card(title: title, expenses: expense))
    }
    func addExpenses() {
        expense.append(Expense(expenseType: "", amount: 0.0))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Any help would be really appreciated.....

1 Answer 1

1

It doesn't seem like you need the following line, because each card has an expense array, you should remove it.

@State private var expense = [Expense]()

Then move the addExpenses func inside struct Card

struct Card: Identifiable {
    var id = UUID()
    var title: String
    var expenses: [Expense]
    
    mutating func addExpenses() {
        expenses.append(Expense(expenseType: "", amount: 0.0))
    }
}

Then call

a.wrappedValue.addExpenses()

In the Button

Button("Add expense") {
    a.wrappedValue.addExpenses()
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.