Warum ist die Animation in meiner Liste fehlerhaft, wenn ich die Position einer Zeile ändere?IOS

Programmierung für iOS
Anonymous
 Warum ist die Animation in meiner Liste fehlerhaft, wenn ich die Position einer Zeile ändere?

Post by Anonymous »

In meiner SwiftUI-iOS-App habe ich eine einfache Liste von Elementobjekten, in der ich beim Durchführen einer Wischaktion in einer Zeile die Priorität eines Elements und damit seine Position in der Liste ändern kann. Allerdings ist die Animation dabei sehr abgehackt:
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")
}
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post