Как я могу удалить элемент из списка, используя лист?IOS

Программируем под IOS
Ответить
Anonymous
 Как я могу удалить элемент из списка, используя лист?

Сообщение Anonymous »

Я немного борюсь с тем, как управлять данными и держать все разделенным. У меня есть представление списка (его данные получают через HTTP -вызов), который может отображать лист для каждого элемента в списке. Из листа элемент может быть удален, это делается с помощью HTTP -запроса, и если это успешно, лист уволен. Я также не знаю, как удалить элемент из списка.struct ContentView: View {
@State private var model = ContentViewModel()
@State private var selectedItem: Item?
@State private var showEditSheet = false

var body: some View {
NavigationStack {
List {
ForEach(model.items) { item in
Text(item.name)
.swipeActions {
Button("Edit") {
selectedItem = item
}
}
}
}
.onAppear {
Task {
model.fetchItems()
}
}
.sheet(item: $selectedItem) {
NavigationStack {
ItemEditView(item: item)
}
}
}
}
}
< /code>
struct EditItemView: View {
@Environment(\.dismiss) private var dismiss
@Bindable var item: Item

@State private var model = EditItemViewModel()

var body: some View {
// Functionality to edit the item omitted.

Button("Delete", role: .destructive) {
Task {
let deletedItem = await model.deleteItem(item)
if deletedItem {
dismiss()
}
}
}
}
}

Для меня наиболее очевидным решением было бы использовать одну модель и использовать ее для обоих представлений, передавая ее из ContentView в edititemview . Эта единственная модель будет иметь список (в настоящее время на ContentModelView ) и функцию Delete (в настоящее время на EdititeMViewModel ), удаление элемента из списка, если удаление будет успешным. Тем не менее, все советы, которые я читаю, заключается в том, что каждая точка зрения должна иметь свою собственную модель, и не должна распространяться ни одна модель между представлениями. Там EdititemView принимает дополнительное закрытие следа, которое содержит логику удаления, при этом содержимое закрытия определяется в ContentView . Моя проблема с этим решением состоит в том, что я не знаю, как проверить, была ли удаление успешной, поэтому я знаю, когда следует отпустить лист и когда не делать. Edititemview можно проверить, было ли удаление успешным. Когда я попробовал это, в первый раз, когда я боролся с тем фактом, что функция удаления модели является асинхронной , во время второй попытки было тривиально легко заставить ее работать. В просмотре редактирования я проверяю, успешно ли удаление и, если да, отклоните представление «Редактировать».struct ContentView: View {
@State private var model = ContentViewModel()
@State private var selectedItem: Item?
@State private var showEditSheet = false

var body: some View {
NavigationStack {
List {
ForEach(model.items) { item in
Text(item.name)
.swipeActions {
Button("Edit") {
selectedItem = item
}
}
}
}
.onAppear {
Task {
model.fetchItems()
}
}
.sheet(item: $selectedItem) {
NavigationStack {
ItemEditView(item: item) {
await model.deleteItem(item: item)
}
}
}
}
}
}
< /code>
struct EditItemView: View {
@Environment(\.dismiss) private var dismiss
@Bindable var item: Item

@State private var model = EditItemViewModel()

var removal: (() async -> Bool)? = nil

var body: some View {
// Functionality to edit the item omitted.

Button("Delete", role: .destructive) {
Task {
let deletedItem = await removal?() ?? false
if deletedItem {
dismiss()
}
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-a-sheet
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»