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

0 ответов

Другие вопросы по тегам