Выбор не обновляется, когда пользователь выбирает строку в списке с множественным выборомIOS

Программируем под IOS
Ответить
Anonymous
 Выбор не обновляется, когда пользователь выбирает строку в списке с множественным выбором

Сообщение Anonymous »

У меня есть список, который меняет цвет строки на синий, когда пользователь выбирает его, но не использует List(selection:) по неизвестным причинам. Когда пользователь нажимает кнопку на панели инструментов, он выбирает все элементы в списке серого цвета, при этом основной выбранный элемент остается синим (это делается для того, чтобы к этому основному выбранному элементу все еще можно было добавлять элементы, пока все остальные элементы выбраны):
Изображение

Это код Я использую, чтобы выделить строку правильным цветом:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»