以编程方式创建一个segue

我有一个共同的UIViewController ,我所有的UIViewsControllers扩展重用一些常见的操作。

我想在这个“Common” UIViewController上设置一个segue,以便所有其他的UIViewControllers继承。

我想弄清楚如何编程。

我想这个问题也可以是我如何为所有的UIViewControllers设置一个segue ,而不需要进入故事板并手动完成。

根据定义,segue不能独立于故事板而存在。 甚至还有班上的名字: UIStoryboardSegue 。 你不会以编程方式创建segues – 它是为你创建它们的storyboard运行时。 你通常可以调用performSegueWithIdentifier:在你的视图控制器的代码中,但是这依赖于已经在故事板中设置了一个segue来引用。

我想你问的是如何创建一个方法在你的公共视图控制器(基类),将过渡到一个新的视图控制器,并将继承所有派生类。 你可以通过创建一个类似于你的基类视图控制器的方法来做到这一点:

 - (IBAction)pushMyNewViewController { MyNewViewController *myNewVC = [[MyNewViewController alloc] init]; // do any setup you need for myNewVC [self presentModalViewController:myNewVC animated:YES]; } 

然后在派生类中,当单击适当的按钮或选择表格行时调用该方法。

我想我会增加另一种可能性。 你可以做的事情之一是你可以连接故事板中的两个场景使用没有附加到动作的segue,然后以编程方式在视图控制器内触发segue。 这样做的方式是,您必须从故事板场景底部的文件所有者图标(即继续场景)拖动,然后右拖到目标场景。 我会扔在一个形象,以帮助解释。

在这里输入图像描述

弹出窗口将显示“手动塞格”。 我选择了Push作为类型。 点击小方块,确保你在属性检查器。 给它一个标识符,你将用它来代码中引用它。

在这里输入图像描述

好吧,接下来我要使用一个编程栏按钮项来继续。 在viewDidLoad或其他地方,我将使用以下代码在导航栏上创建一个按钮项:

 UIBarButtonItem *buttonizeButton = [[UIBarButtonItem alloc] initWithTitle:@"Buttonize" style:UIBarButtonItemStyleDone target:self action:@selector(buttonizeButtonTap:)]; self.navigationItem.rightBarButtonItems = @[buttonizeButton]; 

好的,请注意,选择器是buttonizeButtonTap :. 所以,为这个按钮编写一个void方法,在这个方法中,你会像这样调用segue:

 -(void)buttonizeButtonTap:(id)sender{ [self performSegueWithIdentifier:@"Associate" sender:sender]; } 

在调用prepareForSegue时,sender参数是标识按钮所必需的。 prepareForSegue是一个框架方法,在这个方法中你将实例化你的场景并传递它需要做的工作。 这是我的方法看起来像:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"Associate"]) { TranslationQuizAssociateVC *translationQuizAssociateVC = [segue destinationViewController]; translationQuizAssociateVC.nodeID = self.nodeID; //--pass nodeID from ViewNodeViewController translationQuizAssociateVC.contentID = self.contentID; translationQuizAssociateVC.index = self.index; translationQuizAssociateVC.content = self.content; } } 

好吧,只是测试它,它的工作原理。 希望它可以帮助你。

我一直在使用这段代码来实例化我的自定义segue子类并以编程方式运行它。 这似乎工作。 这有什么问题? 我感到困惑,读了所有其他答案,说不能做。

 UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"]; MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController]; [self prepareForSegue:segue sender:sender]; [segue perform]; 

猜猜这是回答和接受,但我只是想添加一些细节。

我做了什么来解决一个问题,我会提出一个登录视图作为第一个屏幕,然后想登录到应用程序,如果登录是正确的。 我创建了从登录视图控制器到根视图控制器的segue,并给它一个像“myidentifier”的标识符。

然后在检查所有登录代码后,如果登录是正确的,我会打电话

 [self performSegueWithIdentifier: @"myidentifier" sender: self]; 

我最大的误解是,我试图把一个按钮放在一个按钮上,一旦找到它,就会中断这个按钮。

您必须将您的代码链接到您正在使用的UIStoryboard 。 确保你进入你的UIStoryboard YourViewController ,点击它周围的边框,然后将它的identifier字段设置为你在代码中调用的NSString

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

对于故事板中的控制器。

jhilgert00这是你在找什么?

 -(IBAction)nav_goHome:(id)sender { UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"]; [self.navigationController pushViewController: myController animated:YES]; } 

要么…

 [self performSegueWithIdentifier:@"loginMainSegue" sender:self]; 

好吧,你可以创建,也可以继承UIStoryBoardSegue。 子类化主要用于给定的过渡动画。

你可以看到wwdc 2011介绍StoryBoard的视频。 其在YouTube上也可用。

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue

我想补充说明…

一个常见的误解,实际上我已经有一段时间了,是一个storyboard segue是由prepareForSegue:sender:方法触发的。 不是这样。 无论您是否为视图控制器实现了prepareForSegue:sender:方法,storyboard都会执行。

我从Paul Hegarty的优秀的iTunesU讲座中了解到了这一点。 我很抱歉,但不幸的是不记得哪个讲座。

如果在故事板中的两个视图控制器之间连接了一个segue,但是不实现prepareForSegue:sender:方法,则segue仍然会继续到目标视图控制器。 然而,它会继续对该视图控制器毫无准备。

希望这可以帮助。

首先,假设在故事板中有两个不同的视图,并且您想要从一个屏幕导航到另一个屏幕,请按照以下步骤操作:

1)。 使用类文件定义所有视图,并在身份检查器中定义storyboard ID。

2)。 确保将导航控制器添加到第一个视图。 在Storyboard中选择它,然后选择Editor> Embed In> Navigation Controller

3)。 在你的第一课,导入“secondClass.h”

 #import "ViewController.h #import "secondController.h" 

4)。 在必须执行segue的IBAction中添加此命令

 secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"]; [self.navigationController pushViewController:next animated:YES]; 

5)。 @"second"是secondview控制器类,storyboard id。

故事板Segges不能在故事板以外创建。 尽管存在缺陷,您仍然需要将其连接起来。

UistoryboardSegue参考文件明确指出:

您不要直接创建segue对象。 相反,storyboard运行时会在两个视图控制器之间执行segue时创建它们。 如果需要,仍然可以使用UIViewController的performSegueWithIdentifier:sender:方法以编程方式启动segue。 您可能会这样做,以编程方式添加源代码,因此在Interface Builder中不可用。

你仍然可以通过使用presentModalViewController:或者pushViewController:animated:调用来以编程方式告诉storyboard使用segue来呈现一个视图控制器,但是你需要一个storyboard实例。

你可以调用UIStoryboard的类方法来得到一个命名的故事板,捆绑零为主包。

storyboardWithName:bundle:

我反向工程,并做了UIStoryboard's segues的开源(重新)实现: https : //github.com/acoomans/Segway

有了这个库,你可以编程定义segues(没有任何storyboard)。

希望它可以帮助。

实际上有几个问题:

首先,在您为我们上传的项目中,segue不具有“segue1”标识符:

没有标识符

如果你还没有,你应该填写这个标识符。

其次,当你从表视图推送到表视图时,你调用initWithNibName来创建一个视图控制器。 你真的想使用instantiateViewControllerWithIdentifier。

以下是以Creating a segue programmatically的代码示例:

 class ViewController: UIViewController { ... // 1. Define the Segue private var commonSegue: UIStoryboardSegue! ... override func viewDidLoad() { ... // 2. Initialize the Segue self.commonSegue = UIStoryboardSegue(identifier: "CommonSegue", source: ..., destination: ...) { self.commonSegue.source.showDetailViewController(self.commonSegue.destination, sender: self) } ... } ... override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 4. Prepare to perform the Segue if self.commonSegue == segue { ... } ... } ... func actionFunction() { // 3. Perform the Segue self.prepare(for: self.commonSegue, sender: self) self.commonSegue.perform() } ... }