如何在文本框值为nil时取消Unwind Segue(基于现有代码)
当然可以基于现有代码实现这个需求!
不用换掉你当前通过Storyboard关联Unwind Segue的结构,也不需要改用popToRootViewController,只需要在子视图控制器里做两步简单的处理就能实现“文本框为空时取消Segue”的逻辑:
步骤1:给Unwind Segue设置标识符
打开你的Storyboard,选中那个从保存按钮指向主视图Exit的Unwind Segue,在右侧Attributes Inspector的「Identifier」栏里给它起个明确的名字(比如unwindToMainFromSave)。这一步是为了让我们在代码里能精准识别这个Segue。
步骤2:重写Segue拦截方法
在子视图控制器的代码里,重写shouldPerformSegue(withIdentifier:sender:)方法——这个方法会在Segue即将触发时被调用,我们可以在这里做条件判断,决定是否允许Segue执行。
举个Swift代码的例子:
class YourChildViewController: UIViewController { @IBOutlet weak var inputTextField: UITextField! override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { // 只拦截我们设置了标识符的那个Unwind Segue guard identifier == "unwindToMainFromSave" else { // 其他Segue正常放行 return super.shouldPerformSegue(withIdentifier: identifier, sender: sender) } // 检查文本框内容:去掉前后空格后是否为空 guard let inputText = inputTextField.text, !inputText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { // 为空的话,给用户弹个提示,然后返回false取消Segue let alert = UIAlertController(title: "提示", message: "请输入内容后再保存哦", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "好的", style: .default)) present(alert, animated: true) return false } // 内容有效,放行Segue return true } // (可选)如果需要在Segue执行前完成保存到数据库的操作,可以重写这个方法 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "unwindToMainFromSave" { // 调用你的数据库保存逻辑 if let text = inputTextField.text { saveTextToDatabase(text: text) } } } // 你的数据库保存方法 private func saveTextToDatabase(text: String) { // 这里写保存到数据库的代码 } }
逻辑说明
当用户点击保存按钮时:
- Storyboard会尝试触发Unwind Segue
shouldPerformSegue方法被调用,检查文本框内容- 如果内容为空:弹出提示,返回
false,Segue被取消 - 如果内容有效:返回
true,Segue继续执行,同时你可以在prepare(for:sender:)里完成保存到数据库的操作,最后回到主视图
这种方式完全保留了你原有的Unwind Segue关联和主视图的返回逻辑,只需要添加少量代码就能实现需求,非常贴合你现有的代码结构。
内容的提问来源于stack exchange,提问作者Omar Al-Eisa
相关产品推荐
相关产品推荐

