На iPad самая левая панель (боковая панель) SplitNavigationView имеет кнопку панели инструментов, которая отображает лист. Этот лист может загружать или удалять все объекты SwiftData. Эти объекты перечислены на второй панели (Содержимое). Нажатие кнопки загрузки создает новые образцы данных и без проблем отображает их. Однако нажатие кнопки удаления не оказывает никакого эффекта и не запускает обновление представления.
Контекст модели находится в среде, а список подается с помощью @Query. Я попытался внедрить ModelContext в SettingsSheet, а не получать к нему доступ через среду, но результат тот же. Фактически, при перезапуске данные иногда даже не удаляются.
Я сократил код до минимума, чтобы показать проблему, и нужно просто скопировать, вставить и запустить. . Я неправильно понимаю, как операции SwiftData распространяются через среду? Требуется ли другое обращение с наличием листа? Любая помощь принимается с благодарностью.
import SwiftData
import SwiftUI
@main
struct ProblemTestApp: App {
let container: ModelContainer
var body: some Scene {
WindowGroup {
NavigationSplitView {
SidebarView()
} content: {
ContentView()
} detail: {
DetailTabbedView()
}
.modelContainer(container)
}
}
init() {
let schema = Schema( [ Monkey.self ] )
let configuration = ModelConfiguration("ProblemTestApp", schema: schema)
do {
container = try ModelContainer(for: schema, configurations: configuration)
} catch {
fatalError("Could not configure the SwiftData container.")
}
}
}
// SidebarView
struct SidebarView: View {
@State private var showingSettingsSheet = false
var body: some View {
Text("Sidebar Monkey")
.toolbar {
Button {
showingSettingsSheet.toggle()
} label: {
Label("Show settings", systemImage: "gearshape")
}
}
.sheet(isPresented: $showingSettingsSheet) { /* On dismiss. */ } content: {
SettingsSheet()
}
}
}
// ContentView
struct ContentView: View {
@Query var allMonkeys: [Monkey]
var body: some View {
List {
Text("Monkey count = \(allMonkeys.count)")
ForEach(allMonkeys) { monkey in
Text(monkey.name)
}
}
}
}
// DetailTabbedView
struct DetailTabbedView: View {
var body: some View {
Text("Detail Tabbed View (tabs to come)")
}
}
// Monkey model
@Model
final class Monkey: Identifiable {
var id: UUID = UUID()
var name: String = ""
init(name: String) {
self.name = name
}
}
// SettingsSheet
struct SettingsSheet: View {
@Environment(\.modelContext) var context
var body: some View {
NavigationStack {
HStack {
Button("Load") {
for _ in 0...9 {
let monkey = Monkey(name: String(Int.random(in: 0...999)))
context.insert(monkey)
}
}
Button("Delete") {
do {
try context.delete(model: Monkey.self)
print("Deleted all the Monkeys")
} catch {
print("Failed to delete all Monkeys.")
}
}
}
.navigationTitle("Monkey Settings")
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... nview-ipad