You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 {
        // 你的编辑界面实现代码
    }
}

修复逻辑说明

  1. .sheet(item: $forEdit)会在forEdit不为nil时自动展示模态框,且初始化sheet内容时selectedLesson一定是非可选值,彻底避免解包风险。
  2. 关闭模态框只需将forEdit设为nil即可,无需额外维护showEditModal状态,逻辑更简洁。

内容的提问来源于stack exchange,提问作者user2836375

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:17:41