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()
}