A class which holds a list of spells.
@MainActor class ListOfSpells : ObservableObject { @Published var allSpells : [String] = [] @Published var currSpell : SpellInfo @Published var spell : String = "" { didSet { Task { if let spl = await DBAccess.instance.GetSpellInfo(spell: self.spell) { currSpell = SpellInfo(info: spl) } else { currSpell = SpellInfo(info: dummySpellField) } } } } @Published var filterString = "" init() { currSpell = SpellInfo(info: dummySpellField) Task { do { allSpells = try await DBAccess.instance.GetAllNames(force: false) } catch let E { print(E.localizedDescription) } } } }
SwiftUI file
@Model final class ThemeSpell { var spell : String init(spell S: String) { spell = S } } struct ContentView: View { @Environment(\.modelContext) private var modelContext @StateObject var spells = ListOfSpells() @Query private var themeSpells : [ThemeSpell] var body: some View { HStack { List(selection: $spells.spell) { ** //List { ** ForEach(spells.allSpells, id: \.self) { spell in Text(spell) } }.frame(width: 240) Spacer() VStack { //SpellUIView(spell: spells) HStack { Button(">>>") { addItem(name: spells.spell) } .frame(width: 80) .keyboardShortcut(.space, modifiers: [.option]) } } .frame(height: 600) Spacer() List { ForEach(themeSpells) { item in Text(item.spell) *** } }.frame(width: 240) } } private func addItem(name: String) { let newItem = ThemeSpell(spell: name) modelContext.insert(newItem) } }
** commenting out selection:$spells.spell
makes no difference.
*** if this is left in, the app crashes with the following exception:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.'
Can't post entire stack trace. Too big. But the exception is raised a background thread.
0 CoreFoundation 0x000000018dd0c8c0 __exceptionPreprocess + 176 1 libobjc.A.dylib 0x000000018d805eb4 objc_exception_throw + 60 2 CoreAutoLayout 0x000000019640e240 -[NSISEngine tryToOptimizeReturningMutuallyExclusiveConstraints] + 0 3 CoreAutoLayout 0x000000019640e63c -[NSISEngine withBehaviors:performModifications:] + 36 4 AppKit 0x0000000192193fac -[NSView(NSConstraintBasedLayoutInternal) _withAutomaticEngineOptimizationDisabled:] + 48 5 AppKit 0x00000001921936a4 __60-[NSView(NSConstraintBasedLayoutInternal) _setLayoutEngine:]_block_invoke + 328 6 AppKit 0x0000000192193510 -[NSView(NSConstraintBasedLayoutInternal) _setLayoutEngine:] + 492 7 AppKit 0x00000001914cf998 make_and_host_engine + 144 8 AppKit 0x0000000192192cf4 -[NSView(NSConstraintBasedLayoutInternal) _didChangeHostsAutolayoutEngineTo:] + 56 9 AppKit 0x0000000192193ac8 -[NSView(NSConstraintBasedLayoutInternal) _tryToEncapsulateSubtreeLayout] + 100 10 AppKit 0x00000001914fae9c -[NSTableRowData _initializeRowView:atRow:] + 192 11 AppKit 0x00000001914f9b74 -[NSTableRowData _preparedRowViewForRow:storageHandler:] + 120 12 AppKit 0x000000019202d1bc __65-[NSTableRowData _doAutomaticRowHeightsForInsertedAndVisibleRows]_block_invoke_2 + 160 13 Foundation 0x000000018ed95704 __NSINDEXSET_IS_CALLING_OUT_TO_A_BLOCK__ + 24 14 Foundation 0x000000018f494fbc __NSIndexSetEnumerateBitfield + 348 15 AppKit 0x000000019202cf1c __65-[NSTableRowData _doAutomaticRowHeightsForInsertedAndVisibleRows]_block_invoke + 424 16 AppKit 0x000000019202d440 -[NSTableRowData _keepTopRowStableAtLeastOnce:andDoWorkUntilDone:] + 256 17 AppKit 0x00000001915082e8 -[NSTableRowData _updateVisibleViewsBasedOnUpdateItems] + 1300 18 AppKit 0x00000001914f0a6c -[NSTableRowData endUpdates] + 328 19 AppKit 0x00000001914f08e0 -[NSTableView _endUpdateWithTile:] + 108
My SwiftUI code is a modification of the standard code created with New Project. The standard code uses a toolbarItem '+' to create a new item. My code uses a list of strings to which can be added to the model.