#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 для заблокированного. У меня есть эта информация, сохраненная в отдельной таблице, но, думаю, я также могу разместить ее здесь. Я поэкспериментирую с этим сегодня вечером и дам вам знать, как это происходит. Спасибо!