以编程方式创建segue

我有一个通用的UIViewController,我的所有UIViewsControllers都扩展了它来重用一些通用操作。

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

我想知道如何通过编程来实现。

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

210217 次浏览

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

我认为你问的是如何在你的公共视图控制器(基类)中创建一个方法,它将转换到一个新的视图控制器,并将被所有派生类继承。你可以为你的基类视图控制器创建一个这样的方法:

- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];


// do any setup you need for myNewVC


[self presentModalViewController:myNewVC animated:YES];
}

然后在你的派生类中,当适当的按钮被点击或表行被选中时调用那个方法。

我猜这个问题已经得到了回答和接受,但我只是想再补充一些细节。

我解决了一个问题,我将登录视图作为第一个屏幕,然后想要segue到应用程序,如果登录是正确的。我创建了从登录视图控制器到根视图控制器的segue并给它一个像myidentifier这样的标识符。

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

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

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

你可以创建UIStoryBoardSegue的子类。子类化主要用于提供自定义过渡动画。

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

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

你必须将你的代码链接到你正在使用的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];

故事板segue不能在故事板之外创建。尽管有一些缺点,但您需要将其连接起来。

UIStoryboardSegue参考明确指出:

不直接创建segue对象。相反,是故事板 运行时必须在两个视图之间执行segue时创建它们 控制器。类型仍然可以以编程方式启动segue performSegueWithIdentifier:sender: UIViewController的方法 想要的东西。您可以这样做,以从添加的源启动一个segue 因此在接口生成器中不可用。

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

你可以调用UIStoryboards类方法来获得一个命名的故事板,其中主要bundle为nil。

storyboardWithName:bundle:

我一直在使用这段代码来实例化我的自定义segue子类并以编程方式运行它。这似乎很有效。这有什么问题吗?我很困惑,看到所有其他的答案都说这是不可能的。

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

我想我可以加上另一种可能性。你能做的一件事是你能用一个没有附加到动作的segue连接故事板中的两个场景,然后在你的视图控制器中以编程方式触发这个segue。你这样做的方法是,你必须从故事板场景底部的文件所有者图标拖拽到segue场景,然后右拖拽到目标场景。我将附上一张图片来帮助解释。

enter image description here

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

enter image description here

接下来我要用一个程序化的栏按钮项进行segue。在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没有“segue1”标识符:

没有标识符

如果您还没有填写标识符,您应该填写。

第二,当你从表视图推到表视图时,你在调用initWithNibName来创建一个视图控制器。你需要使用instantiateViewControllerWithIdentifier。

我想澄清一下……

一个常见的误解,实际上我有一段时间了,是一个故事板segue是由prepareForSegue:sender:方法触发的。事实并非如此。不管你是否为那个(脱离)视图控制器实现了prepareForSegue:sender:方法,故事板segue都会执行。

我从Paul Hegarty的优秀iTunesU讲座中学到了这个。很抱歉,我不记得是哪节课了。

如果你在故事板中的两个视图控制器之间连接了一个segue,但是没有实现prepareForSegue:sender:方法,这个segue仍然会segue到目标视图控制器。但它会毫无准备地segue到那个视图控制器。

希望这能有所帮助。

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

有了这个库,就可以编程地定义segue(不需要任何故事板)。

希望能有所帮助。

首先,假设你在故事板中有两个不同的视图,你想从一个屏幕导航到另一个屏幕,那么按照以下步骤:

1).在身份检查器中使用类文件和故事板id定义所有视图。

2).确保你添加了一个导航控制器到第一个视图。在故事板中选择它,然后编辑器>嵌入>导航控制器

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"是第二个视图控制器类,故事板id。

下面是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()
}
...
}