以编程方式创建segue

Tia*_*oso 201 objective-c ios segue

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

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

我试图找出如何以编程方式执行此操作.

我想这个问题也可能是如何在没有进入故事板的情况下segue为我所有人设置一个UIViewControllers并且手动完成.

smi*_*Bot 346

我想我会增加另一种可能性.您可以做的一件事是,您可以使用未附加到操作的segue连接故事板中的两个场景,然后以编程方式触发视图控制器内的segue.您这样做的方法是,您必须从故事板场景底部的文件所有者图标(即segueing场景)拖动,然后右键拖动到目标场景.我会投入一张图片来帮助解释.

在此输入图像描述

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

在此输入图像描述

好的,接下来我将使用程序化的条形按钮项目进行segue.在viewDidLoad或其他地方,我将使用以下代码在导航栏上创建一个按钮项:

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

好的,请注意选择器是buttonizeButtonTap:.因此,为该按钮编写一个void方法,在该方法中,您将调用segue,如下所示:

-(void)buttonizeButtonTap:(id)sender{
    [self performSegueWithIdentifier:@"Associate" sender:sender];
    }
Run Code Online (Sandbox Code Playgroud)

调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,只是测试它,它的工作原理.希望它能帮到你.


jon*_*oll 168

根据定义,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];
}
Run Code Online (Sandbox Code Playgroud)

然后在派生类中,在单击相应按钮或选择表行或其他任何内容时调用该方法.

  • 适用于iOS 6+的更新:`UIView`的`presentModalViewController:animated:`已弃用.来自[docs](http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#presentModalViewController:animated :) - *(在iOS 6.0中不推荐使用.使用presentViewController :动画:完成:相反.)* (13认同)
  • @codejunkie:是的,你可以这样做.你可以使用名为`performSegueWithIdentifier:sender:`的`UIViewController`方法. (5认同)
  • 谢谢.遗憾的是我们不能以编程方式完成它.它确实会提高源代码的质量(减少重复总是好的).我会考虑你的建议. (4认同)
  • @jonkroll是否可以从switch语句调用/执行segue,即根据我的索引? (2认同)
  • 我一直在以编程方式创建和执行segue(请参阅我的回答).如果您的答案是正确的,我的代码有什么问题吗? (2认同)

Jea*_*let 80

我一直在使用这段代码来实例化我的自定义segue子类并以编程方式运行它.它似乎工作.这有什么不对吗?我很困惑,阅读所有其他答案,说它无法完成.

UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
[self prepareForSegue:segue sender:sender];
[segue perform];
Run Code Online (Sandbox Code Playgroud)

  • @MarkAmery很多人(包括我)都避免使用故事板.它们很难合并,并且没有编译时检查我传递给`performSegueWithIdentifier:`的ID确实是在故事板中定义的.如果我自己创建segue,我会避免所有问题. (7认同)
  • MyCustomSegue中有什么? (4认同)
  • 它是`UIStoryboardSegue`的自定义子类. (3认同)
  • 我同意让 - 菲利普的观点.管理故事板是一个痛苦的屁股.当然,很容易点击你的方式来创建几个视图并在这里添加一个segue和一个segue,但是管理6个视图,其中16个segues用XML定义,当你有三个开发人员都在摆弄它时很糟糕.无论如何,关键是:代码给你控制,xcode生成的xml没有. (3认同)
  • 我看到iOS7中的[segue perform]发生了崩溃,不确定是否还有其他人遇到此问题. (3认同)
  • Merci beaucoup Jean-Philippe!我有很多页面都需要使用自定义segue动画退出到主菜单.在故事板上创建所有链接本来是荒谬的.非常有用的代码,merci. (2认同)

qri*_*kko 45

猜猜这是回答和接受的,但我只是想补充一些细节.

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

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

[self performSegueWithIdentifier: @"myidentifier" sender: self];
Run Code Online (Sandbox Code Playgroud)

我最大的误解是我试图将segue放在一个按钮上,一旦发现它就会中断segue.

  • 正如我写的另一条评论:我一直在以编程方式创建和执行自定义segues(请参阅我的回答). (4认同)

Jef*_*mes 32

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

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


小智 16

对于故事板中的控制器.

jhilgert00这是你要找的?

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

}
Run Code Online (Sandbox Code Playgroud)

要么...

[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
Run Code Online (Sandbox Code Playgroud)