如何通过条件判断阻止导航至UIViewController?
解决Segue跳转前条件检查的问题
我明白你的困扰——你想在跳转到ViewControllerIncluirItem前先检查pricelist是否不为空,但在prepare(for:sender:)里写return根本拦不住跳转,对吧?这是因为prepare方法是在segue已经启动执行之后才会被调用的,这里的return只能提前结束当前方法的逻辑,没法取消已经触发的跳转流程。
给你两种靠谱的解决办法:
方法一:用shouldPerformSegue拦截segue
苹果专门提供了shouldPerformSegue(withIdentifier:sender:)方法,用来决定是否允许执行某个segue。返回true就执行跳转,返回false就直接拦截。
把这段代码加到你的视图控制器里:
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { // 只处理目标segue if identifier == "SegueToVcIncluirItem" { // 检查pricelist是否存在 guard pricelist != nil else { print("selecione pricelist") // 这里还可以给用户加个弹窗提示,比如: // let alert = UIAlertController(title: "提示", message: "请先选择pricelist", preferredStyle: .alert) // alert.addAction(UIAlertAction(title: "确定", style: .default)) // present(alert, animated: true) return false // 不执行跳转 } return true // 条件满足,允许跳转 } // 其他segue默认允许执行 return true }
之后你的prepare(for:sender:)方法可以保留原来的传值逻辑,不用再做条件检查了——因为只有条件满足时,segue才会触发,才会进入prepare方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "SegueToVcIncluirItem" { let nav = segue.destination as! UINavigationController let childVc = nav.topViewController as! ViewControllerIncluirItem childVc.strTeste = "testado com sucesso" } }
方法二:手动触发Segue(去掉按钮的自动关联)
如果不想用系统的拦截方法,你可以把storyboard里按钮和segue的关联删掉(就是不要从按钮直接拖线到目标VC),改成给按钮加点击事件,在事件里检查条件,满足后再手动调用segue:
- 在storyboard里给按钮添加IBAction:
@IBAction func goToIncluirItemTapped(_ sender: UIButton) { guard pricelist != nil else { print("selecione pricelist") // 同样可以加弹窗提示用户 return } // 条件满足,手动触发segue performSegue(withIdentifier: "SegueToVcIncluirItem", sender: sender) }
- 同样保留原来的
prepare(for:sender:)传值逻辑即可。
这两种方法都能解决你的问题,推荐第一种shouldPerformSegue的方式,更贴合iOS的segue设计模式。
内容的提问来源于stack exchange,提问作者Augusto
相关产品推荐
相关产品推荐

