Missing argument for parameter #1 in call on a button

Viewed 1533

I used to have these rows defined in the list view itself, but now that I've broken the rows off into its own view I'm getting this vague error. Missing argument for parameter #1 in call

It tells me to Insert '<#LocalizedStringKey#>, ' to fix this but I'm not sure why it's needed or what I should put in as the Localized String Key.

    var body: some View {
        
        NavigationView{
            if #available(iOS 14.0, *) {
                List{
                    ForEach(result) { (log: Expenses) in
                        Button(action: {
                            self.editExpense = log
                            print(log.id)
                        }) {
                            HStack() {
                                VStack(alignment: .leading, spacing: 8) {
                                    Text(log.nameText).padding(.horizontal, -7)
                                    Text(log.dateText).font(.caption).padding(.horizontal, -7)
                                }
                                Spacer()
                                VStack(alignment: .trailing, spacing: 8){
                                    Text(log.amountText)
                                    Text(log.expenseAccount?.capitalized ?? "").font(.caption)
                                }
                                
                            }
                            
                        }
                    }
                    
                    .onDelete(perform: onDelete)
                }.padding(.horizontal, -20).navigationTitle("Expense List")

But now I have created a row view and want to call it for each item in Expenses. For some reason I'm getting the error at the line below.

import SwiftUI
import CoreData

@available(iOS 14.0, *)
struct ExpenseList: View {
    
    @State var editExpense: Expenses?
    @State var addExpense = false
    
    @Environment(\.managedObjectContext)
    var context: NSManagedObjectContext
    
    @FetchRequest(fetchRequest: Expenses.expensesList)
    private var result: FetchedResults<Expenses>

    
    init(predicate: NSPredicate?, sortDescriptor: NSSortDescriptor) {
        let fetchRequest = NSFetchRequest<Expenses>(entityName: Expenses.entity().name ?? "Expenses")
        fetchRequest.sortDescriptors = [sortDescriptor]

        if let predicate = predicate {
            fetchRequest.predicate = predicate
        }
        _result = FetchRequest(fetchRequest: fetchRequest)
    }
    
    
    
    var body: some View {
        
        NavigationView{
                List{
                    ForEach(result) { (log: Expenses) in
                        Button(action: {     <----- Missing argument for parameter #1 in call
                            self.editExpense = log
                        })
                        ExpenseRow(name: log.nameText, date: log.dateText, amount: log.amountText, account: log.expenseAccount ?? "")
                    }
                    
                    .onDelete(perform: onDelete)
                }.navigationTitle("Expense List")

ExpenseRow view in case it's needed

import SwiftUI


@available(iOS 14.0, *)
struct ExpenseRow: View {

    let name: String
    let date: String
    let amount: String
    let account: String
    
    
    var body: some View {

            HStack() {
                VStack(alignment: .leading, spacing: 8) {
                    Text(name).padding(.horizontal, -7)
                    Text(date).font(.caption).padding(.horizontal, -7)
                }
                Spacer()
                VStack(alignment: .trailing, spacing: 8){
                    Text(amount)
                    Text(account.capitalized).font(.caption)
                }
                
            }
            
        
    }
}
2 Answers

You need to define what your button looks like, like this:

Button(action: {
    self.editExpense = log
}) {
    /// ↓ put `ExpenseRow` inside the brackets!
    ExpenseRow(name: log.nameText, date: log.dateText, amount: log.amountText, account: log.expenseAccount ?? "") 
}

When I typed Text("Start") it went away:

Button(action: {
            print("Exit The Onboarding")
        }) {
            Text("Start")
        }
        }
Related