Kontextmenü für Aufgabenliste mit Schnellaktionen
Beschreibung
ErstelltDiese View zeigt eine Aufgabenliste, in der Du per langem Druck auf einen Eintrag ein Kontextmenü fürmit Bearbeiten und Löschen öffnen kannst. Die Aktionen wirken direkt auf die zugrunde liegenden Daten, sodass Du Einträge einerumbenennen Liste: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(0.Array(tasks.enumerated()), id: \.<5)element.id) { indexindex, item in
Text("Task \(index)")item.title)
.contextMenu {
// Edit action opens a rename sheet
Button("Edit") {
print("Edit// \(index)")Prepare rename state with current value
newTitle = item.title
renameIndex = index
}
// Destructive delete that removes the selected item
Button("Delete", role: .destructive) {
print(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("DeleteNew \(index)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()
}