Почему .append не перезагружает представление SwiftUI - PullRequest
0 голосов
/ 14 июля 2020

У меня следующая иерархия представлений

Nurse List View > Nurse Card > Favorite button

Просмотр списка медсестер

struct NurseListView: View {
    @State var data: [Nurse] = []

    var body: some View {
        List {
            ForEach(data.indices, id: \.self) { index in
                NurseCard(data: self.$data[index])
            }
        }
    }
}

Карта медсестры

struct NurseCard: View {
    @Binding var data: Nurse
        
    var body: some View {
        FavoriteActionView(data:
            Binding(
                get: { self.data },
                set: { self.data = $0 as! Nurse }
            )
        )
    }
}

Просмотр избранных действий

struct FavoriteActionView: View {
    @Binding var data: FavoritableData
    
    var body: some View {
        Button(action: {
            self.toggleFavIcon()
        }) {
            VStack {
                Image(data.isFavorite ? "fav-icon" : "not-fav-icon")                    
                Text(String(data.likes.count))
            }
        }
    }
    
    private func toggleFavIcon() {
        if data.isFavorite {
            if let index = data.likes.firstIndex(of: AppState.currentUser.uid) {
                data.likes.remove(at: index)
            }
        } else {
            data.likes.append(AppState.currentUser.uid)
        }
    }
}

Когда выполняется toggleFavIcon, он добавляет / удаляет идентификатор пользователя из свойства likes в объекте данных, но я не вижу изменения, если я go не вернусь на предыдущую страницу и снова открою страницу. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 14 июля 2020

Как писал Аспери, здесь хорошо подойдет использование ObservableObject. Примерно так:

class FavoritableData: ObservableObject {
    @Published var likes: [String] = []
    @Published var isFavorite = false
}

struct FavoriteActionView: View {
    @ObservedObject var data: FavoritableData
    
    var body: some View {
        Button(action: {
            self.toggleFavIcon()
        }) {
            VStack {
                Image(data.isFavorite ? "fav-icon" : "not-fav-icon")
                Text(String(data.likes.count))
            }
        }
    }
    
    private func toggleFavIcon() {
        if data.isFavorite {
            if let index = data.likes.firstIndex(of: AppState.currentUser.uid) {
                data.likes.remove(at: index)
            }
        } else {
            data.likes.append(AppState.currentUser.uid)
        }
    }
}
...