Yotam
Yotam

Reputation: 10495

SwiftUI: wrong array passed to sub view

I'm learning SwiftUI and I'm trying to build a simple To-Do app.

My root view is this:

struct ContentView: View {
    @State var reminders: [Reminder] = []
    
    var body: some View {
        print("ContentView", reminders)
        return VStack {
            RemindersListView(
                reminders: reminders
            )
            Button("Add") {
                reminders.append(.empty)
            }
        }
    }
}

And RemindersListView is

struct RemindersListView: View {
    @State var reminders: [Reminder]
    
    var body: some View {
        print("RemindersListView", reminders)
        return List {
            ForEach(reminders.indices) { index in
                ReminderView(reminder: $reminders[index])
            }
        }
    }
}

When I tap the Add button I get the following output:

ContentView []
RemindersListView []
ContentView [Common.Reminder(id: 2FC19F91-9B96-40DB-8CCB-4CBB39C62DBD, done: false, text: "")]
RemindersListView []

Meaning the state in ContentView changed and it re-renders the app, but RemindersListView receives the initial value.

Any ideas? Thanks

Upvotes: 0

Views: 75

Answers (1)

swiftPunk
swiftPunk

Reputation: 1

You are initializing the RemindersListView with an empty Array! then you are modifying it without updating it! You should Bind your data for solving the issue with @Binding, it is easiest way for you but not the only way to bind data, there are more ways to bind data.

struct RemindersListView: View {

    @Binding var reminders: [Reminder] // <<: Here!
    
    var body: some View {

        print("RemindersListView", reminders)

        return List {
            ForEach(reminders.indices) { index in
                ReminderView(reminder: $reminders[index])
            }
        }
    }
}

And also this in :

struct ContentView: View {
    @State var reminders: [Reminder] = []
    
    var body: some View {
        print("ContentView", reminders)
        return VStack {

            RemindersListView(reminders: $reminders) // <<: Here! with $

            Button("Add") {
                reminders.append(.empty)
            }

        }
    }
}

Upvotes: 1

Related Questions