Как я могу удалить элемент списка в SwiftUI из дочернего представления без использования OnDelete(выполнить:)?

#swift #swiftui

#swift #swiftui

Вопрос:

В моем приложении есть функция чата, которая позволяет вам сообщать о ком-либо и блокировать дальнейшее общение с вами.

Вот мой InboxView.swift , который показывает разговоры пользователя:

 List(Array(conversations.conversations.enumerated()), id: .1.id){ (index, conversation) in
    VStack{
        NavigationLink(destination: ChatView(conversation_id: conversation.id, avatar: conversation.avatar, displayName: conversation.displayName, user_id: conversation.receiver_id, parentIndex: index)){
        ConversationList(id : conversation.id, user_id : conversation.user_id, receiver_id : conversation.receiver_id, lastMessage : conversation.lastMessage, avatar : conversation.avatar, displayName : conversation.displayName, startedAt : conversation.startedAt)
        }
        Divider()
    }
}
  

Приведенный выше код просто предоставляет конечному пользователю интерфейс для выбора, в какой диалог они хотят перейти. Вот где все становится сложнее со следующей диаграммой представления:

InboxView --> ChatView --> ProfileView

Каждый --> представляет NavigationLink , который ведет к последующему представлению. На ProfileView.Swift странице я представляю кнопку, с помощью которой конечный пользователь может заблокировать человека, с которым он разговаривает. Я уже выяснил, как вернуть пользователя к InboxView с помощью ряда

@Environment(.presentationMode) var mode

и

self.mode.wrappedValue.dismiss()

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

Как я могу определить, InboxView что ChatView вызвало запрос на удаление, и передать это через подобную функцию?

 func removeRow(at offsets: IndexSet){
    if let first = offsets.first {
        let conversationRemoving = conversations.conversations[first]
        conversations.conversations.remove(at:first)
    }
}
  

Я не вижу в документации для presentationMode запуска функции через wrappedValue

Комментарии:

1. Ну, я чувствую себя глупо. Я слишком много думал об этом. Я только что добавил onAppear() в свой список и запросил у моего API новый список разговоров. Однако было бы неплохо, если бы кто-нибудь мог удалить ответ, чтобы уменьшить необходимость выполнения другого вызова API.

Ответ №1:

Это можно было бы сделать непосредственно внутри List (поскольку у нас есть доступ к индексу в нем) и удалить запись из уже полученных результатов.

Если модель person будет иметь определенное поле (скажем blocked ), то это может быть как показано ниже (в псевдокоде, чтобы быть короче):

 List(Array(conversations.conversations.enumerated()), id: .1.id){ (index, conversation) in
    VStack{
        NavigationLink(destination: ChatView(...)) {
            ConversationList(...)
        }
        Divider()
    }
    .onAppear { // called on show and on return back
        if conversation.receiver.blocked {         // << here !!
           // better to do it asynchronously
           DispatchQueue.main.async {     
              self.conversations.conversations.remove(at: index)    // << here !!
           }
        }
    }
}
  

Комментарии:

1. это умно. Я не рассматривал возможность изменения модели диалога для включения Bool для заблокированного. У меня есть эта информация, сохраненная в отдельной таблице, но, думаю, я также могу разместить ее здесь. Я поэкспериментирую с этим сегодня вечером и дам вам знать, как это происходит. Спасибо!