Die Auswahl wird nicht aktualisiert, wenn der Benutzer eine Zeile in einer Mehrfachauswahlliste auswähltIOS

Programmierung für iOS
Anonymous
 Die Auswahl wird nicht aktualisiert, wenn der Benutzer eine Zeile in einer Mehrfachauswahlliste auswählt

Post by Anonymous »

Ich habe eine Liste, die die Farbe einer Zeile in Blau ändert, wenn der Benutzer sie auswählt, aber List(selection:) aus unbekannten Gründen nicht verwendet. Wenn der Benutzer eine Schaltfläche in der Symbolleiste drückt, werden alle Elemente in der Liste in grauer Farbe ausgewählt, wobei das ausgewählte Hauptelement immer noch in Blau angezeigt wird (damit diesem ausgewählten Hauptelement weiterhin Dinge hinzugefügt werden können, während alle anderen Elemente ausgewählt sind):
Image

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)
Ich habe jedoch Probleme, wenn alle Elemente ausgewählt sind und ich versuche, das ausgewählte Hauptelement zu ändern. Der Code funktioniert, aber die Zeile .listRowBackground aktualisiert die neue Farbe der Hauptzeile des ausgewählten Elements nicht auf Blau. Die einzige Möglichkeit, dies zu beheben, besteht darin, .id(item.lastSelectedDate) zum HStack hinzuzufügen. So habe ich es im obigen animierten Beispiel zum Laufen gebracht. Item ist ein Modellobjekt in SwiftData und sollte beobachtbar sein, daher verstehe ich nicht, warum eine Änderung an lastSelectedData eines Elements die Aktualisierung nicht auslöst. Ich habe versucht, eine berechnete Eigenschaft zu verwenden oder die Logik in einem separaten Abschluss/einer separaten Funktion auszuführen, aber es funktioniert nicht.
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))
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post