What are the methods for jumping a page?
What are the methods for jumping a page?
That depends on what you mean by "jumping a page".
I don't think that's a recognized developer term, can you clarify your question?
Do you mean in navigation, go directly to VC after the next one ?
If so, there is a simple way.
I assume you have given storyboard ID to the VCs in the navigation stack as VC1, VC2, VC3…
If you want to go from VC1 to VC3 skipping VC2, several options:
- hardwire a segue from VC1 to VC2…
- do it programmatically.
- with a button in VC1, with IBAction:
@IBAction func skipNextVC(_ sender: UIButton) {
if let vcNextPlus2 = storyboard?.instantiateViewController(withIdentifier: "VC3") {
navigationController?.pushViewController(vcNextPlus2, animated: true)
}
}
Unfortunately, the following does not work, as next VC are not yet instantiated:
// if let navController = self.navigationController {
// let allVCs = navController.viewControllers
// print("skip", navController, allVCs)
// for (indexVC, vc) in allVCs.enumerated() {
// if vc == self {
// let indexPlus2 = indexVC + 2
// if indexPlus2 < allVCs.count {
// let vcNextPlus2 = allVCs[indexPlus2]
// navController.pushViewController(vcNextPlus2, animated: true)
// }
// }
// }
// }
But you can do something close:
- create an array of VC ids
let vcIDs = ["VC1", "VC2", "VC3", "VC4", "VC5"]
Set restorationID equal to storyboard ID, by checking "Use Storyboard ID" in Identity inspector
@IBAction func skipNextVC(_ sender: UIButton) {
let nToSkip = 2 // skip n
// Set restorationID equal to storyboard ID, by checking "Use Storyboard ID" in Identity inspector
if let id = self.restorationIdentifier, let originatingIndex = vcIDs.firstIndex(of: id) {
let indexPlus = originatingIndex + 1 + nToSkip
if indexPlus < vcIDs.count {
if let vcNextPlus = storyboard?.instantiateViewController(withIdentifier: vcIDs[indexPlus]) {
navigationController?.pushViewController(vcNextPlus, animated: true)
}
}
}
}
In SwiftUI, the simplest is to select a destination in navigationLink
- declare var to know the case
var next : Int // 1 or 2 depending on case
@State var fire = false // we fire link
- With viewBuilder, select the appropriate view
@ViewBuilder func destination(nextView: Int) -> some View {
switch nextView {
case 1: View1()
case 2: View2()
default: EmptyView()
}
}
- Use it In link
Button(action: {
fire = true
}) {
NavigationLink(destination: destination(nextView: next ?? 3), isActive: $fire) { // 3 do nothing
Text("Continue")
}
}