别让误触删掉成果:用 AI + confirmationDialog 给 iOS 危险操作加二次确认

别让误触删掉成果:用 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。你只要盯住两个按钮角色:
  • destructive 表示危险按钮,Apple 文档把它定义为 destructive button 的角色。4
  • cancel 表示取消操作,Apple 文档把它定义为取消某个操作的按钮角色。5
翻成产品语言就是:红色危险按钮只做真正不可轻易反悔的事,取消按钮必须让用户能退回原页面。

直接给 AI 的缺陷单

你可以把下面这段交给 Cursor、Claude Code 或 Xcode 里的 AI 助手:
请给这个 SwiftUI 页面里的危险操作增加 confirmationDialog,只做最小改动,不重写页面结构。
  1. 找到会删除、清空、放弃编辑或退出未保存内容的按钮。
  2. 不要在按钮点击时直接执行危险动作,先设置一个 @State 布尔值来展示确认对话框。
  3. 确认对话框里保留两个选择:一个 role: .destructive 的危险确认按钮,一个 role: .cancel 的取消按钮。
  4. 危险按钮的文案要说清楚对象,例如「删除这条记录」或「放弃本次编辑」,不要只写「确定」。
  5. 用户点取消时什么数据都不要改,继续留在当前页面。
  6. 如果页面有未保存内容,只在内容真的被改过时才弹确认;没有改动时可以直接退出。
最后一条很关键。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 步验收:
  1. 第一次点击:点删除或放弃按钮,只能出现确认对话框,数据不能立刻消失。
  2. 取消路径:点取消后,对话框关闭,原页面、输入内容和选择状态都保留。
  3. 确认路径:点危险确认后,才真正删除、清空或退出。
  4. 文案检查:危险按钮要写动作和对象,不能只写「确定」。
  5. 无改动退出:如果编辑页没有任何改动,点取消可以直接关闭,不要多弹一次。
  6. 误触复查:在小屏和单手操作时重复点几次,确认危险按钮不会和普通按钮贴得太近。
如果页面里已经有左滑删除,还要多测一遍:左滑只是露出删除入口,真正删除仍然应该等用户在确认对话框里点危险按钮。这样能把「快捷」和「安全」分开。

今天最小可行动作

选一个你手里最容易误触的页面,不要全 App 大改。先写下三行:
  • 哪个按钮点错后损失最大?
  • 用户点取消时必须保留什么?
  • 危险确认按钮上要写哪几个字?
把这三行和上面的缺陷单一起交给 AI。今天的目标不是设计一套完整风控系统,而是先让一个真实危险按钮从「点了就没了」变成「用户明确确认后才执行」。

Contenido relacionado

  • Inicia sesión para comentar.
More from this channel