Ale*_*erg 17 uinavigationcontroller ios swift
我在导航控制器中嵌入了三个视图控制器.我想从VC1转到VC3,这样在VC3中导航项的后退按钮会将用户引导到VC2而不是VC1.我认为这应该通过在创建VC3时将VC2添加到VC1和VC3之间的导航堆栈或跳过第二个View Controller来完成.
我试过这个:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let identifier = segue.identifier {
switch identifier {
case "JumpToThirdVCSegue":
if let secondvc = segue.destinationViewController as? SecondViewController {
secondvc.performSegueWithIdentifier("ThirdVCSegue", sender: self)
}
default: break
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法让它发挥作用.当View Controller尚未打开时,可能无法执行segue?
在导航堆栈中跳过View Controller /添加View Controller的最佳方法是什么?我希望这可以帮助你理解我正在做的事情:
Ada*_*dam 23
这样的事情应该有效:
self.navigationController?.pushViewController(viewController2, animated: true)
self.navigationController?.pushViewController(viewController3, animated: true)
Run Code Online (Sandbox Code Playgroud)
编辑:
如果要在不被用户注意的情况下推送第二个视图控制器,则需要在按下第三个视图控制器后将其添加到导航控制器.这可以通过实施来完成UINavigationControllerDelegate.您可以将第二个视图控制器存储在变量中,并将其插入到委托方法中的导航控制器层次结构中.您的主视图控制器将如下所示:
class MyViewController: UIViewController, UINavigationControllerDelegate {
var viewControllerToInsertBelow : UIViewController?
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.delegate = self
}
func pushTwoViewControllers() {
if let viewController2 = self.storyboard?.instantiateViewControllerWithIdentifier("id1"),
let viewController3 = self.storyboard?.instantiateViewControllerWithIdentifier("id2") { //change this to your identifiers
self.viewControllerToInsertBelow = viewController2
self.navigationController?.pushViewController(viewController3, animated: true)
}
}
//MARK: - UINavigationControllerDelegate
func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
if let vc = viewControllerToInsertBelow {
viewControllerToInsertBelow = nil
let index = navigationController.viewControllers.indexOf(viewController)!
navigationController.viewControllers.insert(vc, atIndex: index)
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
if var navstack = navigationController?.viewControllers{
navstack.append(contentsOf: [vc1,vc2])
navigationController?.setViewControllers(navstack, animated: true)
}
Run Code Online (Sandbox Code Playgroud)
效果很好
编辑:使用swift和segues,这应该工作:
override func performSegueWithIdentifier(identifier: String?, sender: AnyObject?) {
super.performSegueWithIdentifier(identifier, sender: sender);
if identifier == "JumpToThirdVCSegue" {
// now the vc3 was already pushed on the navigationStack
var navStackArray : [AnyObject]! = self.navigationController!.viewControllers
// insert vc2 at second last position
navStackArray.insert(viewController2, atIndex: navStackArray.count - 2)
// update navigationController viewControllers
self.navigationController!.setViewControllers(navStackArray, animated:false)
}
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以覆盖VC1中的performSegueWithIdentifier,以便在实际执行segue到VC3时更改导航堆栈(并且不仅仅是在准备中).这假设您要在VC1中处理此特殊导航逻辑.
| 归档时间: |
|
| 查看次数: |
13913 次 |
| 最近记录: |