如何让Delete按钮执行前置操作后触发已有unwind segue?
解决Delete按钮先执行Firebase删除再触发Unwind Segue的问题
我来帮你搞定这个问题~核心思路是不要直接把Unwind Segue绑定到Delete按钮,而是先给按钮添加点击事件,在事件里完成Firebase删除操作(注意要等异步操作完成后),再手动触发Unwind Segue。下面是具体步骤:
1. 确保Unwind Segue的基础设置正确
首先要确认目标ViewController(你要返回的上一个VC)里已经定义了Unwind方法,而且Storyboard里的Segue标识符设置无误:
- 在目标VC中添加Unwind方法:
@IBAction func unwindToPreviousViewController(segue: UIStoryboardSegue) { // 这里可以写返回后的逻辑,如果不需要就留空即可 } - 回到当前VC的Storyboard界面,选中当前VC的黄色箭头(ViewController对象),按住右键拖到界面顶部的
Exit按钮上,选择刚才定义的unwindToPreviousViewController方法; - 选中刚创建的这个Unwind Segue,在右侧Attributes Inspector里设置Identifier(比如
unwindToPrevious),这个标识符后面要和代码里的完全匹配。
2. 给Delete按钮添加点击事件,执行删除+触发Segue
给Delete按钮关联一个IBAction,在里面先处理Firebase的异步删除操作,等删除完成(成功或失败)后再决定是否触发Segue:
@IBAction func deleteButtonTapped(_ sender: UIButton) { // 替换成你自己的Firebase文档引用 let targetDocument = Firestore.firestore().collection("yourCollection").document("yourDocumentId") // 执行Firebase删除(异步操作) targetDocument.delete { error in if let deleteError = error { // 删除失败:提示用户,不要触发Segue print("删除失败:\(deleteError.localizedDescription)") let errorAlert = UIAlertController(title: "删除失败", message: "请稍后重试", preferredStyle: .alert) errorAlert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(errorAlert, animated: true) } else { // 删除成功:触发Unwind Segue self.performSegue(withIdentifier: "unwindToPrevious", sender: self) } } }
3. 排查你之前调用performSegueWithIdentifier失败的可能原因
你之前调用没成功,大概率是这几个问题:
- 标识符不匹配:代码里的Segue标识符和Storyboard里设置的不一致,要完全一模一样(区分大小写);
- 没在异步回调里调用:Firebase删除是异步的,如果直接在删除方法外面调用
performSegue,会导致还没删完就跳转了,甚至可能因为线程问题失败; - Unwind方法签名错误:Unwind方法必须是
@IBAction,参数必须是UIStoryboardSegue类型,不能写错。
额外优化:添加删除确认弹窗
如果需要用户确认后再删除,可以在按钮点击事件里先弹确认框,确认后再执行删除逻辑:
@IBAction func deleteButtonTapped(_ sender: UIButton) { let confirmAlert = UIAlertController(title: "确认删除", message: "确定要删除这条信息吗?删除后无法恢复", preferredStyle: .alert) confirmAlert.addAction(UIAlertAction(title: "取消", style: .cancel)) confirmAlert.addAction(UIAlertAction(title: "删除", style: .destructive, handler: { _ in // 这里执行上面的Firebase删除+Segue逻辑 let targetDocument = Firestore.firestore().collection("yourCollection").document("yourDocumentId") targetDocument.delete { error in if let deleteError = error { print("删除失败:\(deleteError.localizedDescription)") let errorAlert = UIAlertController(title: "删除失败", message: "请稍后重试", preferredStyle: .alert) errorAlert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(errorAlert, animated: true) } else { self.performSegue(withIdentifier: "unwindToPrevious", sender: self) } } })) present(confirmAlert, animated: true) }
内容的提问来源于stack exchange,提问作者MathEnthusiast
相关产品推荐
相关产品推荐

