RealmSwift中SwipeAction唤起编辑模态框遇空值解包错误求助
问题分析与解决方案
错误原因
你遇到的Unexpectedly found nil while unwrapping an Optional value错误,是因为在.sheet中强制解包forEdit!导致的。尽管你逻辑上先给forEdit赋值再打开模态框,但SwiftUI的状态更新和sheet的初始化时机存在异步性,可能出现sheet初始化时forEdit仍为nil的情况,触发解包崩溃。
另外注意原代码中@ObservedResults(Lesson.self) var lesson存在笔误,应该是var lessons(因为ForEach遍历的是lessons)。
修复方案
改用SwiftUI提供的.sheet(item:)替代.sheet(isPresented:),它专门适配基于可选对象的模态框展示逻辑,能自动避免nil解包风险:
主视图修改代码
@ObservedResults(Lesson.self) var lessons @State private var forEdit: Lesson? NavigationStack { List { ForEach(lessons) { lesson in NavigationLink(destination: LessonView(selectedLesson: lesson)) { Text("\(lesson.name)") } .swipeActions(allowsFullSwipe: false) { Button { forEdit = lesson // 直接赋值,sheet会自动触发展示 } label: { Label("Edit", systemImage: "pencil") } .tint(.blue) } } } .navigationTitle(title) } .sheet(item: $forEdit) { selectedLesson in NavigationStack { EditLesson(lesson: selectedLesson) .toolbar { // 添加取消按钮用于关闭模态框 ToolbarItem(placement: .cancellationAction) { Button("Cancel") { forEdit = nil } } } } .interactiveDismissDisabled() }
EditLesson视图修改代码
struct EditLesson: View { @ObservedRealmObject var lesson: Lesson // 移除原有的@Binding var showModal,通过父视图的forEdit = nil关闭模态框 var body: some View { // 你的编辑界面实现代码 } }
修复逻辑说明
.sheet(item: $forEdit)会在forEdit不为nil时自动展示模态框,且初始化sheet内容时selectedLesson一定是非可选值,彻底避免解包风险。- 关闭模态框只需将
forEdit设为nil即可,无需额外维护showEditModal状态,逻辑更简洁。
内容的提问来源于stack exchange,提问作者user2836375
相关产品推荐
相关产品推荐

