使用Custom Segue以编程方式导航到另一个ViewController

时间:2012-10-20 21:10:27

标签: iphone objective-c ios xcode

故事板中有两个视图控制器。我以编程方式成功地从第一个导航到第二个:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
YourViewController *yourViewController = (YourViewController *)[storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];

我希望在不使用界面构建器的情况下,使用我的custom Segue导航到其他页面而不是pushViewController

这是我可以轻松使用界面构建器的自定义Segue:

@interface LeftToRightSegue : UIStoryboardSegue

如何以编程方式进行?

5 个答案:

答案 0 :(得分:8)

这就是我如何做到的。我创建了我的segue子类,然后从我的sourceViewController IE中调用它,初始化我的destinationViewcontroller,然后将它们传递给我的自定义segue类。

YourViewController *yourViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"YOURStoryboardViewControllerID"];
CustomSegueClass *segue = [[CustomSegueClass alloc] initWithIdentifier:@"ANYid" source:self destination:yourViewController];
[segue perform ];

答案 1 :(得分:3)

我相信您必须使用界面构建器来通知故事板,两个元素之间应存在特定类型的segue以及如何识别它。您可以使用performSegueWithIdentifier:在代码中触发它,但根据文档,您无法在代码中实际创建一个:

“您的应用永远不会直接创建segue对象;当触发segue时,它们总是由iOS代表您创建。”

答案 2 :(得分:2)

正如Phillip Mills所写,你必须在IB中创建一个segue。您可以通过从一个视图控制器拖动到另一个视图控制器并从显示的菜单中选择“自定义”来完成此操作。然后选择新的segue和打开属性检查器。输入segue的标识符,并将其类设置为您已实现的类的名称。完成这些步骤后,您可以使用performSegueWithIdentifier:

答案 3 :(得分:1)

我假设您正在询问如何实现自定义segue的子类,以便您不必使用导航控制器?

如果是,那么我会覆盖perform课程中的LeftToRightSegue方法,如下所示:

- (void)perform
{
  UIViewController *source = self.sourceViewController;
  UIViewController *destination = self.destinationViewController;

  UIWindow *window = source.view.window;

  CATransition *transition = [CATransition animation];
  [transition setDuration:1.0];
  [transition setTimingFunction:[CAMediaTimingFunction functionWithName:UIViewAnimationOptionCurveEaseInOut]];
  [transition setType:kCATransitionPush];
  [transition setSubtype:kCATransitionFromRight];
  [transition setFillMode:kCAFillModeForwards];
  [transition setRemovedOnCompletion:YES];


  [window.layer addAnimation:transition forKey:kCATransition];
  [window setRootViewController:self.destination];
}

如果您想要与推送不同的内容,则可以更改动画类型。 另外不要忘记导入QuartzCore:

#import <QuartzCore/QuartzCore.h>

答案 4 :(得分:1)

快速方式,单击Segue并选择Custom。 现在,您可以按如下方式创建UIStoryboardSegue的子类

class MySegue: UIStoryboardSegue { override func perform() { let source = sourceViewController as! UIViewController if let navigation = source.navigationController { navigation.pushViewController(destinationViewController as! UIViewController, animated: false) } } }

然后选择Segue并正确设置Class和模块。希望它有所帮助