SwiftUI refre sh список по предупреждению принять - PullRequest
0 голосов
/ 16 апреля 2020

У меня проблема с реализацией 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, когда представление загружается по навигационной ссылке. Однако это означает, что когда пользователи нажимают «удалить» каждый запрос на добавление в друзья, он не отражается в списке до тех пор, пока представление не будет перерисовано (нажмите «Назад», а затем снова щелкните ссылку навигации). Помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...