我们试图弄清楚当向后导航时如何有条件地排除我们的后台堆栈中的某些屏幕。例如,采取以下屏幕:
- 主仪表板(您可以从这里转到 2 或 3)
- 订单管理(您可以从这里转到 3 或 6)
- 输入订单
- 查看订单
- 订单确认(如果您在此处完成,则后面应跳过 3 和 4)
- 订单状态(如果您在此处完成,则返回应跳过 5(它已经跳过 3 和 4))
屏幕 3-5 代表输入订单,因此如果您已进入确认页面,我们不希望您返回查看或编辑页面。
出于同样的原因,如果您从确认页面导航到“订单状态”,我们不希望您导航回“订单确认”,而是返回“订单管理”或“主仪表板”(取决于关于你是如何到达那里的)
注意:我们知道 popToViewController 以及它如何让您跳过您所在位置和您指定的控制器之间的所有控制器。问题是我不知道那个视图控制器是什么。我只知道我想跳过哪个(如果它们存在的话)。更重要的是,后退按钮反映了堆栈中的内容,而不是我要弹出的内容。这就是为什么我希望告诉系统“返回时忽略堆栈中的这些”。希望这是有道理的。
我的粗略尝试是像这样修改后堆栈...
func showConfirmation() {
guard navigationController = navigationController else {
return
}
navigationController.pushViewController(orderConfirmation, animated:true)
if let orderEntryIndex = navigationController.viewControllers.index(of:orderEntry),
let orderReviewIndex = navigationController.viewControllers.index(of:orderReview){
navigationController.viewControllers.removeSubrange(orderEntryIndex...orderReviewIndex)
}
}
func showStatus() {
guard navigationController = navigationController else {
return
}
navigationController.pushViewController(orderStatus, animated:true)
if let orderConfirmationIndex = navigationController.viewControllers.index(of:orderConfirmation){
navigationController.viewControllers.remove(at: orderConfirmationIndex)
}
}
注意:这是简化的代码。我们实际上并没有挂在视图控制器的实例上。我们通过在后台堆栈中查找它们的类型来找到索引。这仅用于简单说明目的。
当导航工作时,在动画期间,后退按钮显示原始后退位置,然后在动画之后,标签的值“捕捉”以显示新的后退位置。这当然证明这不是正确的方法。
我知道有放松的segues,但这担心你要去哪里。我们只想在导航离开后从积压中删除项目,否则保持后台堆栈完好无损。
那么如何实现这种忽略先前步骤的行为呢?