https://youtube.com/shorts/aVP-V-vf10E
Wenn ich eine .id(UUID()) zur Liste hinzufüge, wird das Problem behoben, aber das scheint keine gute Lösung zu sein. Warum sollte ich ständig aktualisieren müssen, wenn Item beobachtbar ist? Warum passiert das und gibt es eine bessere Möglichkeit, es zu beheben?
Der vollständige Code ist unten aufgeführt:
Code: Select all
import Foundation
import SwiftData
@Model
final class Item
{
var id: UUID = UUID()
var text: String = ""
var priority: Int = 0
init(text: String)
{
self.text = text
}
}
struct ContentView: View
{
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item]
var body: some View
{
List
{
Section
{
ItemList(filteredAndSortedItems: filteredAndSortedItems())
}
}
.id(UUID())
.onAppear
{
seedItemsIfNeeded()
}
}
private func filteredAndSortedItems() -> [Item]
{
self.items.sorted
{
$0.priority > $1.priority
}
}
private func seedItemsIfNeeded()
{
for item in items
{
modelContext.delete(item)
}
let dummyItems =
[
Item(text: "First item"),
Item(text: "Second item"),
Item(text: "Third item"),
Item(text: "Fourth item")
]
for item in dummyItems
{
modelContext.insert(item)
}
}
}
struct ItemList: View
{
var filteredAndSortedItems: [Item]
var body: some View
{
ForEach(self.filteredAndSortedItems)
{
item in
Text("\(item.text) (Priority: \(item.priority))").swipeActions(edge: .trailing)
{
Menu
{
ForEach(0...10, id: \.self)
{
value in
Button
{
withTransaction(Transaction(animation: .none))
{
item.priority = value
}
}
label:
{
if item.priority == value
{
Label("\(value)", systemImage: "checkmark")
}
else
{
Text("\(value)")
}
}
}
}
label:
{
Image(systemName: "number")
}
}
}
}
}
Mobile version