如何避免 SwiftUI 窗口点击关闭按钮导致程序崩溃的 AI 编程难题?

摘要:问题背景 最近在开发 MacOS APP 时,遇到点击窗口(Search Window)的关闭按钮(×)会导致应用崩溃问题。我提供给 AI 实现搜索功能的提示词如下: 为应用程序新增搜索功能,具体实现要求如下: 1
问题背景 最近在开发 MacOS APP 时,遇到点击窗口(Search Window)的关闭按钮(×)会导致应用崩溃问题。我提供给 AI 实现搜索功能的提示词如下: 为应用程序新增搜索功能,具体实现要求如下: 1. 界面元素添加: - 在应用程序界面的合适位置(建议为导航栏或工具栏)添加一个视觉清晰的搜索按钮 - 设计并实现搜索按钮的交互效果,包括悬停状态和点击反馈 2. 搜索窗口实现: - 点击搜索按钮时,打开一个搜索窗口 - 搜索窗口采用垂直布局,包含以下核心元素: - 顶部搜索输入框(支持键盘回车触发搜索) - 中部搜索结果显示区域 - 可选的搜索状态提示和清空/取消按钮 3. 搜索结果区域布局: - 采用双列布局设计搜索结果窗口: - 左侧列:显示匹配的对话标题列表,包含对话标题和相关元数据 - 右侧列:显示当前选中对话中的消息列表,每项显示包含搜索关键字的消息上下文 - 实现左侧列列表项的选中状态视觉反馈,确保用户清晰了解当前选择项 4. 关键字高亮与内容展示: - 对搜索结果中的所有关键字进行醒目高亮处理(建议使用不同颜色背景或文本颜色) - 历史对话标题列表中需突出显示包含关键字的标题 - 消息列表中需展示关键字所在的上下文内容片段,确保上下文完整且关键字突出 5. 交互功能实现: - 实现点击消息列表项的交互功能: - 点击后将主界面窗口置于顶层显示 - 保持搜索窗口处于打开状态(非关闭) - 自动定位并滚动主界面至对应的聊天位置 - 高亮显示主界面中定位到的具体消息 6. 性能与用户体验要求: - 实现搜索功能的即时响应,搜索延迟不超过300ms - 添加搜索过程中的加载状态提示 - 处理无搜索结果的空状态,提供友好提示 - 确保搜索功能在不同屏幕尺寸下的响应式显示效果 7. 辅助功能: - 支持键盘导航(箭头键选择、Enter确认) - 实现搜索窗口的关闭机制(右上角关闭按钮、ESC键) - 添加搜索历史记录功能(可选) 该问题应该是 AI 在实现 5. 交互功能实现 功能时引入的。问题表现为: 错误信息: EXC_BAD_ACCESS (code=1, address=0x20) 影响范围: 每次都能稳定复现,完全阻断搜索功能的使用 表现: 崩溃,出现转圈(鼠标自旋)无响应 最终和 AI 结对编程解决了这个问题,过程也是十分坎坷 🥲,有时候 AI 也不是也容易就能发现问题、解决问题,甚至制造自身无法解决的问题。 问题分析过程 第一阶段:初期诊断 添加了全面的日志记录来追踪窗口生命周期: SearchWindowController 的窗口创建/显示日志 SearchView 的生命周期事件(onAppear/onDisappear) SearchReducer 的状态变化日志 发现: 日志显示在 windowWillClose 委托回调时,系统正在进行不安全的状态操作。 第二阶段:错误的尝试 添加了全面的日志记录来追踪窗口生命周期: SearchWindowController 的窗口创建/显示日志 SearchView 的生命周期事件(onAppear/onDisappear) SearchReducer 的状态变化日志 发现: 日志显示在 windowWillClose 委托回调时,系统正在进行不安全的状态操作。 第二阶段:错误的尝试 尝试了多个失败的方案: 添加 NSWindowController 包装 - 引入强引用,导致更复杂的引用计数问题 在 windowWillClose 中进行异步清理 - 导致界面冻结(转圈) 添加 windowClosingInProgress 标志 - 仍然导致死锁 从 SearchView 发送 reducer action - NSWindowDelegate 回调与 SwiftUI 状态更新产生竞争条件 根本发现: 问题不是单一的逻辑错误,而是架构性冲突 - 多个层级都在尝试管理窗口的生命周期。
阅读全文