
Это код Я использую, чтобы выделить строку правильным цветом:
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)
Однако у меня возникают проблемы, когда все элементы выбраны, и я пытаюсь изменить основной выбранный элемент. Код работает, но строка .listRowBackground не обновляет цвет новой строки основного выбранного элемента на синий. Единственный способ исправить это — добавить .id(item.lastSelectedDate) в HStack, именно так я заставил его работать в анимированном примере выше. Item является объектом модели в SwiftData и должен быть наблюдаемым, поэтому я не понимаю, почему изменение элемента LastSelectedData не вызывает обновление. Я пробовал использовать вычисляемое свойство или выполнять логику в отдельном замыкании/функции, но это не работает.
Кто-нибудь знает, как это исправить без использования .id (что вызывает небольшие сбои в анимации в моем основном приложении)? Полный код ниже:
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))
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ected-list
Мобильная версия