Переменная состояния SwiftUI не обновляется - PullRequest
1 голос
/ 07 февраля 2020

У меня есть структура Пользователь со списком хобби, следующим образом:

struct User: Hashable, Codable, Identifiable, Equatable {
    var id: String
    var name: String
    var hobbies: [String]
}

Затем я создаю представление списка, используя список пользователей в качестве переменной состояния. При нажатии кнопки в представлении списка новое хобби добавляется к хобби пользователя.

struct UsersListView: View {

    @State var users: [User]


    var body: some View {

                TitleView(titleText: "Friends")
                    .padding(.leading, 30.0)

                List(userDisplayList) { user in
                     Text(user.name)
                     Text(user.hobbies.joined(separator: ", "))
                     Button(action: {self.users[0].hobbies.append("new hobby")}
                }
            }
        }
    }
}

Однако, когда я нажимаю на кнопку, переменная состояния пользователя не изменяется и остается прежней. Кто-нибудь может объяснить, что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Попробуйте это:

    struct User: Hashable, Codable, Identifiable, Equatable {
    var id = UUID()
    var name: String
    var hobbies: [String]
}

struct UsersListView: View {

    @State var users: [User] = [User(name: "aaaa", hobbies: [])]


    var body: some View {

        List(users) { user in
                     Text(user.name)
                     Text(user.hobbies.joined(separator: ", "))
                        Button(action: {
                            self.users[0].hobbies.append("new hobby")
                        }) {
                            Text("Create hobby")
                        }

                }
            }
        }
0 голосов
/ 07 февраля 2020

Вы отображаете каждого пользователя в userDisplayList, а не в users.

Поэтому, когда вы изменяете какое-то значение в users, SwiftUI думает, что вам нечего обновлять в вашем представлении, поскольку ничего не зависит переменная users.

Попробуйте вместо этого использовать List(users) { user in, если в вашем userDisplayList.

нет дополнительных логи c.
...