Swift 4/Xcode:多ViewController跳转同一页面后返回对应原页面求助
解决多ViewController跳转至ScoreVC后返回对应原VC的问题
嘿,作为Swift 4和Xcode的新手,这个跳转返回的问题确实很容易踩坑,我来一步步给你讲清楚怎么搞定它,完全用你能理解的方式~
首先搞懂核心逻辑:跳转方式决定返回行为
我们常用的两种跳转方式,对应不同的返回逻辑,选对方式就解决了大半问题:
方式1:用导航控制器(UINavigationController)跳转(最推荐新手用)
这种方式相当于把所有ViewController串成一个“栈”,跳转到新页面是把它“压栈”,返回就是把它“出栈”,自动回到上一个页面。
操作步骤:
- 给任务VC嵌入导航控制器:打开Storyboard,右键点击你的第一个任务ViewController,选择「Embed in」→「Navigation Controller」。这样所有后续从这个VC跳转的页面都会在同一个导航栈里。
- 给ScoreVC设置Storyboard ID:选中Score ViewController,打开右侧的「Identity Inspector」(第三个图标),在「Storyboard ID」里填个名字,比如
ScoreViewController(要和代码里对应)。 - 在每个任务VC里写跳转代码:给跳转按钮添加IBAction,代码如下:
@IBAction func jumpToScore(_ sender: UIButton) { // 从Storyboard里加载ScoreVC,加个判断避免崩溃 guard let scoreVC = storyboard?.instantiateViewController(withIdentifier: "ScoreViewController") as? ScoreViewController else { print("找不到对应的ScoreVC,检查Storyboard ID是否正确!") return } // 用push方式跳转,把ScoreVC加入导航栈 navigationController?.pushViewController(scoreVC, animated: true) }
- 自动获得返回按钮:跳转后,ScoreVC的导航栏会自动出现默认的返回箭头,点击它就会回到你刚才跳转过来的那个任务VC,完全不用额外写返回逻辑!
方式2:用模态跳转(Present)(适合不需要导航栏的场景)
如果你不想用导航控制器,而是用弹出式的模态跳转,那只要正确写返回代码就行:
操作步骤:
- 同样给ScoreVC设置Storyboard ID(和上面步骤2一样)。
- 任务VC里的跳转代码:
@IBAction func presentScoreVC(_ sender: UIButton) { guard let scoreVC = storyboard?.instantiateViewController(withIdentifier: "ScoreViewController") as? ScoreViewController else { print("检查Storyboard ID是否正确!") return } // 用模态方式弹出ScoreVC present(scoreVC, animated: true, completion: nil) }
- ScoreVC里的返回按钮代码:自己给ScoreVC加一个返回按钮,然后写IBAction:
@IBAction func goBackToOriginalVC(_ sender: UIButton) { // 关闭当前模态VC,自动回到弹出它的那个任务VC dismiss(animated: true, completion: nil) }
这种方式下,不管是哪个任务VC弹出的ScoreVC,dismiss后都会回到对应的原VC。
新手容易踩的坑
- 不要混合跳转方式:一会儿用push一会儿用present,会导致导航栈混乱,返回逻辑出错,新手尽量只用一种方式。
- Storyboard ID一定要对应:代码里的ID和Storyboard里填的必须完全一致,不然会崩溃,一定要仔细检查。
- 不要随便修改导航栈:新手别乱试
popToRootViewController这类代码,除非你明确知道自己要做什么,不然会打乱默认的返回逻辑。
内容的提问来源于stack exchange,提问作者Shadi Saba
相关产品推荐
相关产品推荐

