如何避免 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 状态更新产生竞争条件
根本发现: 问题不是单一的逻辑错误,而是架构性冲突 - 多个层级都在尝试管理窗口的生命周期。
