SwiftUI: как я могу удалить элемент / вычеркнуть элемент из списка дел при использовании LazyVStack, а не списка?
введите описание изображения здесь
Начну с того, что я совсем новичок в программировании, у меня практически нет опыта. Мне нужно составить список дел для школьного проекта, и мне очень нужна помощь.
Я пытаюсь сделать список дел с более эстетичным макетом, поэтому вместо представления списка я сделал его LazyVStack, встроенным в ScrollView. Теперь я пытаюсь придумать способ:
а. удалять разные задачи; Я пытался сделать это с помощью EditButton(), но поскольку это не представление списка, которое я использовал, я не могу использовать простой модификатор: .onDelete.
б. отметьте пункты из списка дел. В основном то же самое, что и выше, только при нажатии маленькой кнопки с галочкой для каждого дела.
Я пытался использовать логическую переменную состояния: @State private var, показывающуюGroupBox: Bool = true, а затем переключать ее при нажатии кнопки, но по какой-то причине это не сработало.
Я также пробовал функцию deleteTodo (см. второй блок кода), но безрезультатно.
Поэтому я был бы очень признателен, если бы кто-нибудь помог мне со следующими вещами:
а. при нажатии кнопки EditButton() на панели навигации есть способ удалить todos.
б. что при нажатии маленького флажка в каждой задаче задача удаляется / больше не сохраняется в CoreData.
Вот код моего списка дел:
import SwiftUI
import CoreData
struct ContentView: View {
let persistenceController = PersistenceController.shared
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Todo.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Todo.name, ascending: true)])
var todos: FetchedResults<Todo>
@State private var showingNewToDoPanel: Bool = false
// @State private var showingGroupBox: Bool = true
var body: some View {
NavigationView {
ScrollView {
LazyVStack {
ForEach(self.todos, id: \.self) { todo in
// if isShowingGroupBox { could be used for a "Clear all" functionality, where when the user clicks on a button, all of the todos disappear.
GroupBox {
HStack {
CheckBoxView()
Text(todo.name ?? "Untitled").foregroundColor(.black)
Spacer()
Text(todo.priority ?? "No priority")
}
}//: GROUP BOX
.clipShape(Capsule())
.shadow(color: Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.25)), radius:4, x:0, y:4)
// }//:CONDITIONAL
}
}//: LAZYVSTACK
.padding(.horizontal, 20)
.padding(.top, 20)
.navigationBarTitle("To-Dos", displayMode: .automatic)
.navigationBarItems(leading:
EditButton(),
trailing:
Button(action: {
self.showingNewToDoPanel.toggle()
}, label: {
Image(systemName: "plus")
}) //:BUTTON
.sheet(isPresented: $showingToDoView, content: {
ToDoView().environment(\.managedObjectContext, self.managedObjectContext)
})
)
}//: SCROLLVIEW
}//: NAVIGATIONVIEW
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
И вот мой код для кнопки.
import SwiftUI
import CoreData
struct CheckBoxView: View {
// @State private var isShowingToDo: Bool = true "CLEAR ALL"-esque FUNCTIONALITY
let persistenceController = PersistenceController.shared
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Todo.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Todo.name, ascending: true)])
var todos: FetchedResults<Todo>
func deleteTodo(at offsets: IndexSet) {
for index in offsets {
let todo = todos[index]
managedObjectContext.delete(todo)
do {
try managedObjectContext.save()
} catch {
print(error)
}
}
}
var body: some View {
GeometryReader() { geometry in
Button(action: {
// self.isShowingToDo.toggle()
deleteTodo()
}, label: {
RoundedRectangle(cornerRadius: 4)
.fill(Color(#colorLiteral(red: 0.978395164, green: 0.9725784659, blue: 0.9828661084, alpha: 1)))
.frame(width: geometry.size.height / 0.8, height: geometry.size.height / 0.8)
.shadow(color: Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.25)), radius:1, x:0, y:1)
})
}
}
}