
别让误触删掉成果:用 AI + confirmationDialog 给 iOS 危险操作加二次确认
这一技教你把删除、清空、放弃编辑这类危险操作先拦在确认对话框里,再用危险动作表、AI 缺陷单和 6 步真机清单验收,避免用户一次误触就丢掉内容。
手机上的危险操作,最怕不是用户找不到按钮,而是按钮太好点。清空草稿、删除收藏、退出编辑页、取消发布,这些动作一旦发生,用户通常没有耐心听你解释「刚才是误触」。
今天这招很适合 PM 自己补:让 AI 给 SwiftUI 页面加
confirmationDialog。它是 SwiftUI 的官方确认对话框修饰符,在某个条件为 true 时展示确认对话框。1先说版本前提:实践资料显示,SwiftUI 在 iOS 15 和 macOS 12 加入了确认对话框能力。2 如果你的项目还要支持更老系统,先让 AI 帮你检查 deployment target,再决定是不是需要旧写法兜底。
先判断:哪些动作值得弹确认
确认弹窗不是给所有按钮加保险。它只适合「点错后代价明显」的动作。如果用户只是切换筛选、收藏一篇文章、打开一个设置项,弹确认会很烦。
你可以先让 AI 帮你做一张危险动作表:
| 动作 | 要不要确认 | 原因 | 确认文案应该说明什么 |
|---|---|---|---|
| 删除账号内的一条记录 | 要 | 数据可能不可恢复 | 删除对象是什么,删完还能不能找回 |
| 清空购物车 | 要 | 会影响多个商品 | 会清空多少项,用户是否可重新添加 |
| 退出有改动的编辑页 | 要 | 可能丢失未保存内容 | 是继续编辑,还是放弃改动 |
| 普通收藏 / 取消收藏 | 通常不要 | 代价低,容易反悔 | 用即时反馈就够了 |
| 切换列表排序 | 不要 | 不改变用户数据 | 保留当前选择即可 |
这一步的重点是把「危险」说清楚。危险不是按钮颜色红,而是用户点错之后会失去内容、钱、状态或时间。
原理:先拦住动作,再让用户做最后选择
confirmationDialog 的核心思路很简单:用户点了危险入口后,不要立刻执行删除或放弃;先把一个状态改成 true,让系统弹出确认选项。Hacking with Swift 的教程也把它和 alert() 放在一起解释:两者都挂在视图层级上,都可以在条件为 true 时由 SwiftUI 自动显示,并在里面放按钮执行不同动作。3对 PM 来说,你不用先学完整 API。你只要盯住两个按钮角色:
翻成产品语言就是:红色危险按钮只做真正不可轻易反悔的事,取消按钮必须让用户能退回原页面。
直接给 AI 的缺陷单
你可以把下面这段交给 Cursor、Claude Code 或 Xcode 里的 AI 助手:
请给这个 SwiftUI 页面里的危险操作增加confirmationDialog,只做最小改动,不重写页面结构。
- 找到会删除、清空、放弃编辑或退出未保存内容的按钮。
- 不要在按钮点击时直接执行危险动作,先设置一个
@State布尔值来展示确认对话框。- 确认对话框里保留两个选择:一个
role: .destructive的危险确认按钮,一个role: .cancel的取消按钮。- 危险按钮的文案要说清楚对象,例如「删除这条记录」或「放弃本次编辑」,不要只写「确定」。
- 用户点取消时什么数据都不要改,继续留在当前页面。
- 如果页面有未保存内容,只在内容真的被改过时才弹确认;没有改动时可以直接退出。
最后一条很关键。Peter Friese 在复刻 Reminders 编辑体验时,用
isModified 判断用户是否改过内容:如果改过,点 Cancel 才弹确认;如果没改过,就直接关闭。6 这比「每次退出都问一遍」舒服得多。两个容易被 AI 写错的地方
第一,不要把确认弹窗写成「装饰」。有些 AI 会在按钮旁边加一个弹窗,但危险动作仍然在第一次点击时已经执行了。验收时要看执行顺序:第一次点击只能打开确认对话框,真正删除必须发生在用户点了危险确认之后。
第二,不要用模糊文案。
确定、继续、是 这类按钮在危险场景里不够清楚。用户看到的应该是动作本身,比如「删除草稿」「清空购物车」「放弃修改」。Use Your Loaf 的示例也把危险确认按钮写成「Delete all items?」,并用 .destructive 角色让系统把它按危险动作呈现。2如果你要保护的是「退出编辑页」,还要让 AI 区分两个入口:用户点导航栏的取消按钮,和用户用手势下滑关闭 sheet。Peter Friese 的文章提到,
interactiveDismissDisabled 可以阻止 sheet 被下滑关闭,但如果想在用户尝试下滑时弹出同一个确认对话框,纯 SwiftUI 的内建能力并不完整,需要额外处理。6 PM 不需要自己写这段复杂代码,但要把需求写进缺陷单:下滑关闭也不能静默丢草稿。真机验收:6 个动作就够
改完后不要只看弹窗有没有出现。按这 6 步验收:
- 第一次点击:点删除或放弃按钮,只能出现确认对话框,数据不能立刻消失。
- 取消路径:点取消后,对话框关闭,原页面、输入内容和选择状态都保留。
- 确认路径:点危险确认后,才真正删除、清空或退出。
- 文案检查:危险按钮要写动作和对象,不能只写「确定」。
- 无改动退出:如果编辑页没有任何改动,点取消可以直接关闭,不要多弹一次。
- 误触复查:在小屏和单手操作时重复点几次,确认危险按钮不会和普通按钮贴得太近。
如果页面里已经有左滑删除,还要多测一遍:左滑只是露出删除入口,真正删除仍然应该等用户在确认对话框里点危险按钮。这样能把「快捷」和「安全」分开。
今天最小可行动作
选一个你手里最容易误触的页面,不要全 App 大改。先写下三行:
- 哪个按钮点错后损失最大?
- 用户点取消时必须保留什么?
- 危险确认按钮上要写哪几个字?
把这三行和上面的缺陷单一起交给 AI。今天的目标不是设计一套完整风控系统,而是先让一个真实危险按钮从「点了就没了」变成「用户明确确认后才执行」。
참고 출처
- 1confirmationDialog(_:isPresented:titleVisibility:actions:message:) | Apple Developer Documentation
- 2SwiftUI Confirmation Dialogs
- 3Showing multiple options with confirmationDialog() - a free Hacking with iOS: SwiftUI Edition tutorial
- 4destructive | Apple Developer Documentation
- 5cancel | Apple Developer Documentation
- 6Confirmation Dialogs in SwiftUI
관련 콘텐츠
- 로그인하면 댓글을 작성할 수 있습니다.
More from this channel›
- 别让 iPad 版只是放大 iPhone:用 AI + NavigationSplitView 做双栏界面
- 别让页面跳转像迷宫:用 AI + NavigationStack 给 iOS 流程搭清楚路径
- 别让设置每次重置:用 AI + AppStorage 给 iOS 偏好做本地保存
- 别让头像上传卡在权限坑:用 AI + PhotosPicker 给 iOS 接上相册选择
- 别让列表像没更新:用 AI + refreshable 给 iOS 页面加下拉刷新
- 别让用户只会截图:用 AI + ShareLink 给 iOS 页面接上系统分享
- 别让按钮像没反应:用 AI + sensoryFeedback 给 iOS 操作加触感
- 别让键盘打断用户:用 AI + FocusState 给 iOS 表单接上下一项
