in a SwiftUI
app I’m making that utilizes SwiftData
, I have a class ProjectView
that displays a list of reader names in the column of a NavigationSplitView
from which the user can add to or remove from:
struct ProjectView: View
{
@State private var projectItem: ProjectItem
@State private var alertPresented = false
@State private var userInput = ""
@State private var readers: [Reader]
@State private var newReader = ""
init(projectItem: ProjectItem)
{
self.projectItem = projectItem
self.readers = projectItem.readers
}
var body: some View
{
NavigationSplitView
{
List
{
ForEach(self.projectItem.readers)
{
reader in NavigationLink(reader.name, destination: ReaderView())
}
.onDelete
{
indexes in for index in indexes
{
self.projectItem.readers.remove(at: index)
}
}
}
.toolbar
{
#if os(iOS)
ToolbarItem(placement: .navigationBarTrailing)
{
EditButton()
}
#endif
ToolbarItem
{
Button(action:
{
self.alertPresented = true
},
label:
{
Label("Add Item", systemImage: "plus")
})
.alert("Reader Name:", isPresented: self.$alertPresented)
{
TextField("", text: self.$userInput)
Button("Cancel", role: .cancel) { }
Button("OK")
{
let reader = Reader(name: self.userInput)
self.projectItem.readers.append(reader)
self.userInput = ""
}
}
}
}
}
detail:
{
AggregateView()
}
#if os(macOS)
.navigationSplitViewColumnWidth(min: 180, ideal: 200)
#endif
.navigationTitle(self.projectItem.name)
.toolbar
{
ToolbarItem
{
Button(action: addItem)
{
Label("Add Item", systemImage: "plus")
}
}
}
}
}
Where ProjectItem is a SwiftData model that has an array of Readers in it:
@Model
class ProjectItem
{
var name: String
@Relationship(deleteRule: .cascade) var readers = [Reader]()
init(name: String)
{
self.name = name
}
}
and
@Model
class Reader
{
var name:String;
init(name: String)
{
self.name = name
}
}
Everything is working fine except for the fact that when a user adds a reader name to the list, the order gets all screwed up, and doesn’t append to the end like it should (seems random where the reader name gets inserted):
When I declare a @State
Reader Array, point it to self.projectItems.readers
, and work off that, then it works fine (but of course, doesn’t save to SwiftData
). I can’t figure out what’s going on here, could it be the way I’m passing a projectItem
from my ContentView
to ProjectView
?
@State private var selectedProjectItem: ProjectItem?
…
.navigationDestination(isPresented: self.$shouldNavigate)
{
if let selectedProjectItem = self.selectedProjectItem
{
ProjectView(projectItem: selectedProjectItem)
}
}
Lost here, any help is much appreciated.