У меня проблема с реализацией SwiftUI обновления элементов списка в списке SwiftUI после того, как один из них был удален.
Список представляет запросы на добавление в друзья пользователей, и каждая строка является уникальным экземпляром view FriendRequestRow()
Вот изображение, показывающее, как выглядит каждая строка в списке запросов друзей https://i.stack.imgur.com/oPPDI.jpg
Моя проблема в том, что при нажатии красной кнопки X и пользователи попадают в оповещение (https://i.stack.imgur.com/yAoqH.jpg) и выбирают «Удалить», оно успешно удаляет значение из базы данных приложения, но удаленная строка сохраняется в списке, пока представление не будет перерисовано.
Ниже приведен код для представления, содержащего список, с удалением некоторых несущественных строк.
struct FriendsListView: View {
@State var Friend_Request_Array : [Friend] = []
@State var Current_Friend_Array : [Friend] = []
var body: some View {
VStack {
HStack{
Text("Friend Requests")
.font(.headline)
.padding()
.foregroundColor(Color.white)
Spacer()
}
.background(Color(UIColor.systemGray))
.padding(.top, -8)
// List of friend requests.
List {
ForEach(Friend_Request_Array) { Friend in
FriendRequestRow(Friend: Friend, Friend_Display_Name: "")
}
}
.buttonStyle(PlainButtonStyle())
.frame(minHeight: 0, maxHeight: 150)
}.navigationBarTitle(Text("Your Friends"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
}) {
Image(systemName: "plus")
})
.onAppear{
self.Friend_Request_Array = []
self.Current_Friend_Array = []
self.Load_Friends()
}
}
func Load_Friends() {
// Load lists full of friends.
let db = Firestore.firestore()
// Populates friend request array with pending friend requests.
// Populates current friends array with all of the current users' friends.
}
}
Затем, вот представление для каждого отдельного списка row:
struct FriendRequestRow: View {
@State var Friend: Friend
@State var Friend_Display_Name: String
@State private var showingDeleteRequestAlert = false
var body: some View {
HStack{
Image("example-avatar")
.resizable()
.frame(width: 40, height: 40)
.clipShape(Circle())
VStack(alignment: .leading){
Text(Friend_Display_Name)
.font(.headline)
}.padding()
Spacer()
Button(action: {
// Accept request.
}) {
Image(systemName: "checkmark.circle.fill")
.font(.system(size: 30))
.foregroundColor(Color(UIColor.systemGreen))
}
Button(action: {
// Deny and remove friend request. Should pop up an 'are you sure' alert.
self.showingDeleteRequestAlert = true
}) {
Image(systemName: "xmark.circle.fill")
.font(.system(size: 30))
.foregroundColor(Color(UIColor.systemRed))
}
.alert(isPresented: $showingDeleteRequestAlert) {
Alert(title: Text("Are you sure?"),
message: Text("If you delete this request it will have to be resent."), primaryButton: .destructive(Text("Remove")) {
// Removal of request from the database
// Re-render list
// **THIS IS WHERE MY ISSUE IS, HOW DO I RERENDER LIST?**
}, secondaryButton: .cancel())
}
}.onAppear{
// Get Each users display name.
}
}
Как видно, я заполняю список с помощью атрибута onAppear, когда представление загружается по навигационной ссылке. Однако это означает, что когда пользователи нажимают «удалить» каждый запрос на добавление в друзья, он не отражается в списке до тех пор, пока представление не будет перерисовано (нажмите «Назад», а затем снова щелкните ссылку навигации). Помощь!