
Das ist der Code, den ich verwende Verwenden Sie, um die Zeile in der richtigen Farbe hervorzuheben:
Code: Select all
HStack
{
Button
{
if (!item.isSelected)
{
self.queriedItems.forEach { $0.isSelected = false }
item.isSelected = true
}
item.lastSelectedDate = .now
}
label:
{
Text(item.name)
.frame(maxWidth: .infinity, alignment: .leading)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
}
.listRowBackground(item.isSelected ? ((self.itemIsLastSelected(item: item)) ? Color.blue : Color.gray) : nil)
Weiß jemand, wie man das beheben kann, ohne .id zu verwenden (was zu einer etwas fehlerhaften Animation in meiner Haupt-App führt)? Vollständiger Code unten:
Code: Select all
import SwiftUI
import SwiftData
@Model
final class Item
{
var name: String
var createdDate: Date = Date.now
var lastSelectedDate: Date = Date.now
var isSelected: Bool = false
init(name: String)
{
self.name = name
}
}
struct ContentView: View
{
@Environment(\.modelContext) private var modelContext
@Query private var queriedItems: [Item]
var body: some View
{
List
{
Section
{
ForEach(self.queriedItems.sorted { $0.createdDate < $1.createdDate })
{
item in
HStack
{
Button
{
if (!item.isSelected)
{
self.queriedItems.forEach { $0.isSelected = false }
item.isSelected = true
}
item.lastSelectedDate = .now
}
label:
{
Text(item.name)
.frame(maxWidth: .infinity, alignment: .leading)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
}
.listRowBackground(item.isSelected ? ((self.itemIsLastSelected(item: item)) ? Color.blue : Color.gray) : nil)
//.id(item.lastSelectedDate)
}
}
header:
{
Button(action:
{
self.queriedItems.forEach { $0.isSelected = true }
},
label:
{
Image(systemName: "person.2")
})
.buttonStyle(.plain)
}
}
.onAppear
{
self.seedItems()
}
}
private func itemIsLastSelected(item: Item) -> Bool
{
if let lastSelectedItem = self.queriedItems.max(by: { $0.lastSelectedDate < $1.lastSelectedDate })
{
return lastSelectedItem == item
}
else
{
return false
}
}
private func seedItems()
{
for item in queriedItems
{
modelContext.delete(item)
}
let names = [
"Item 1",
"Item 2",
"Item 3",
"Item 4",
"Item 5"
]
for name in names
{
modelContext.insert(Item(name: name))
}
}
}
Mobile version