如何推送两个视图控制器,但仅为第二个控制器设置动画转换?

Cen*_*ion 46 cocoa-touch objective-c storyboard uikit ios

我在storyboad中有三个控制器(FirstVC,SecondVC,ThirdVC),导航是顺序的:用户可以从FirstVC导航到SecondVC,然后导航到ThirdVC.现在,我需要制作一些按钮,它将从FirstVC打开ThirdVC,但也会将SecondVC放在导航堆栈上,所以当用户从ThirdVC按回来时,他将返回到SecondVC.因此,我不需要从FirstVC到SecondVC的动画,只需要在导航控制器堆栈上推送SecondVC,然后仅动画转换到ThirdVC.

我无法找到如何禁用performSegueWithIdentifier的动画,所以我想我应该手动从storyboard实例化SecondVC,将它放在导航堆栈上,然后为ThirdVC执行performSegueWithIdentifier.任何想法如何做到这一点?

Kim*_*afr 79

如果您在第一个VC中,您正在寻找的解决方案:

NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
[controllers addObject:secondVc];
[controllers addObject:thirdVC];
[self.navigationController setViewControllers:controllers animated:YES];
Run Code Online (Sandbox Code Playgroud)

这将在第三个VC中生成动画,而第二个VC在此过程中不会变得可见.当用户按下后退按钮时,它们将返回到第二个VC

  • 我喜欢这个解决方案,在另一种情况下,我需要维护当前堆栈,我通过在调用setViewControllers方法之前访问当前堆栈并添加新的控制器来实现这一点。(swift)```var controllers = self.navigationController?.viewControllers``` (2认同)

Dav*_*ith 26

在Swift中保留用于推送视图控制器的标准动画:

let pushVC = UIViewController()
let backVC = UIViewController()

if let navigationController = navigationController {

  navigationController.pushViewController(pushVC, animated: true)

  let stackCount = navigationController.viewControllers.count
  let addIndex = stackCount - 1
  navigationController.viewControllers.insert(backVC, atIndex: addIndex)

}
Run Code Online (Sandbox Code Playgroud)

这会pushVC正常显示并插入backVC到导航堆栈中,同时保留动画和历史记录UINavigationController.

你可以使用setViewControllers,但你将失去标准的推动画.


Sal*_*aed 6

来自KimAMartinsen解决方案的Swift版本

let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "Tests") as! firstViewController

let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "Dashboard") as! SecondViewController

var controllers = self.navigationController?.viewControllers
controllers?.append(firstVC)
controllers?.append(secondVC)
self.navigationController?.setViewControllers(controllers!, animated: true)
Run Code Online (Sandbox Code Playgroud)


小智 5

extension UINavigationController {
    open func pushViewControllers(_ inViewControllers: [UIViewController], animated: Bool) {
        var stack = self.viewControllers
        stack.append(contentsOf: inViewControllers)
        self.setViewControllers(stack, animated: animated)
    }
}
Run Code Online (Sandbox Code Playgroud)