swiftui ondelete()需要indexset的行ID 我正在尝试将SwiftUi与OnDelete()方法一起捕获被刷的行的todoitem.ID。 我已经设置了一个名为Arrayoftodostodelete的数组,该数组将是已删除行的ID i ...

问题描述 投票:0回答:1
。 我已经设置了一个名为

arrayOfTodosToDelete

的数组,该数组将是已删除行的ID,即。  但是我得到了
["aaa", "ccc"]
,但无法弄清楚原因。  由于我正在使用MVVM,并且需要在保存网络时同步,因此我无法使用
["aaa", "aaa"]

array.remove(atOffsets: offsets)
	
步入这种方法,您可以从todo中删除the the the theand

import SwiftUI struct TodoItem: Identifiable { var id: String var todoID: String var todoName: String var isCompleted: Bool = false } final class TodoListViewModel: ObservableObject { @Published var items: [TodoItem] = [TodoItem]() @Published var appIsLoading: Bool = false var sortedTodos: [TodoItem] { return self.items.sorted { $0.todoName < $1.todoName } } func fetchTodos() { self.appIsLoading = true DispatchQueue.main.asyncAfter(deadline: .now() + 1) { self.items = [ TodoItem(id: "aaa", todoID: "aaa", todoName: "Take Out Trash", isCompleted: false), TodoItem(id: "bbb", todoID: "bbb", todoName: "Clean Room", isCompleted: true), TodoItem(id: "ccc", todoID: "ccc", todoName: "Check Mail", isCompleted: false), TodoItem(id: "ddd", todoID: "ddd", todoName: "Walk The Dog", isCompleted: true) ] self.appIsLoading = false } } } struct TodoListView: View { var todosArray: [TodoItem] var appIsLoading: Bool @State private var hideCompleted: Bool = false @State private var todoToDelete: TodoItem? @State private var arrayOfTodosToDelete: [String] = [String]() private var filteredTodos: [TodoItem] { return self.todosArray.filter({ (todo) -> Bool in var returnVal = true if self.hideCompleted == true && todo.isCompleted == true { returnVal = false } return returnVal }) } func deleteTodo(atOffsets indexSet: IndexSet) { // cannot figure out how to get the id of the swiped row and append to array arrayOfTodosToDelete print("at offsets \(indexSet)") if let index = indexSet.first { print("index is \(index)") todoToDelete = filteredTodos[index] print("todo To Delete \(String(describing: todoToDelete))") if let getTodo = filteredTodos.first(where: { $0.todoID == todoToDelete!.todoID }) { print("todo To Delete \(String(describing: todoToDelete!.todoID))") print("get Todo id \(getTodo.todoID)") arrayOfTodosToDelete.append(String(todoToDelete!.todoID)) } } } func onSubmit() { print("Current Array is \(self.arrayOfTodosToDelete)") // here if user deleted "Take Out Trash" and "Clean Room" Im needing an array here of ["aaa", "bbb"] // here handle sync to database // however here I'm getting ["aaa", "aaa"] instead of ["aaa", "ccc"] } var body: some View { ZStack { List { ForEach(filteredTodos) { todo in Text(todo.todoName) }.onDelete(perform: deleteTodo) } if appIsLoading { Text("Loading") } }.navigationTitle("Todos") .toolbar(content: { ToolbarItem(placement: .topBarLeading) { Button(action: { withAnimation { self.hideCompleted.toggle() } }, label: { Text("Hide") }) } ToolbarItem(placement: .topBarTrailing) { Button(action: { self.onSubmit() }, label: { Text("Save") }) } }) } } struct ContentView: View { @StateObject var todosListViewModel = TodoListViewModel() private func getData() { self.todosListViewModel.fetchTodos() } var body: some View { ZStack { NavigationView { TodoListView(todosArray: todosListViewModel.sortedTodos, appIsLoading: todosListViewModel.appIsLoading) } }.onAppear { self.getData() } } } #Preview { ContentView() }
    
swiftui methods mvvm on-delete
1个回答
0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.