Skip to main content

Kontextmenü für Aufgabenliste mit Schnellaktionen

Beschreibung

Diese View zeigt eine Aufgabenliste, in der Du per langem Druck auf einen Eintrag ein Kontextmenü mit Bearbeiten und Löschen öffnen kannst. Die Aktionen wirken direkt auf die zugrunde liegenden Daten, sodass Du Einträge umbenennen oder entfernen kannst, ohne die Hauptansicht zu verlassen.

🔍 Zweck

  • Schnelle Bearbeitung von Listeneinträgen ohne Navigation
  • Kontextbezogene Aktionen für Aufgaben, Mails oder Dateien
  • Reduktion von UI-Überladung durch sekundäre Menüs
  • Prototyping von Listeninteraktionen in SwiftUI
  • Demonstration von destruktiven Rollen und Editierdialogen

🖥️ Betriebssystem

iOS

📄 Codebeispiel

import SwiftUI

@main
struct QuickActionMenuApp: App {
    var body: some Scene {
        WindowGroup {
            QuickActionMenuExample()
        }
    }
}

// Simple model for a task item
private struct TaskItem: Identifiable, Equatable {
    let id = UUID()
    var title: String
}

public struct QuickActionMenuExample: View {
    // Backing data for the list
    @State private var tasks: [TaskItem] = (0..<5).map { TaskItem(title: "Task \($0)") }
    // State for rename flow
    @State private var renameIndex: Int? = nil
    @State private var newTitle: String = ""

    public init() {}

    public var body: some View {
        List {
            // Use enumerated to access index for in-place edits/deletes
            ForEach(Array(tasks.enumerated()), id: \.element.id) { index, item in
                Text(item.title)
                    .contextMenu {
                        // Edit action opens a rename sheet
                        Button("Edit") {
                            // Prepare rename state with current value
                            newTitle = item.title
                            renameIndex = index
                        }
                        // Destructive delete that removes the selected item
                        Button("Delete", role: .destructive) {
                            tasks.remove(at: index)
                        }
                    }
            }
        }
        // Present a sheet to rename the selected task
        .sheet(isPresented: Binding(
            get: { renameIndex != nil },
            set: { if !$0 { renameIndex = nil } }
        )) {
            NavigationStack {
                Form {
                    // Text field to change the task title
                    TextField("New title", text: $newTitle)
                        .textInputAutocapitalization(.sentences)
                }
                .navigationTitle("Rename Task")
                .toolbar {
                    // Cancel closes the sheet without changes
                    ToolbarItem(placement: .cancellationAction) {
                        Button("Cancel") { renameIndex = nil }
                    }
                    // Save applies the new title to the selected item
                    ToolbarItem(placement: .confirmationAction) {
                        Button("Save") {
                            if let i = renameIndex, tasks.indices.contains(i) {
                                tasks[i].title = newTitle.trimmingCharacters(in: .whitespacesAndNewlines)
                            }
                            renameIndex = nil
                        }
                        .disabled(newTitle.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty)
                    }
                }
            }
        }
    }
}

// Modern Swift 5.10+ preview syntax
#Preview {
    QuickActionMenuExample()
}