如何检查使用了哪个 segue

Posted

技术标签:

【中文标题】如何检查使用了哪个 segue【英文标题】:How to check which segue was used 【发布时间】:2013-04-23 10:48:26 【问题描述】:

我有两个 segue 导致相同的 viewController。有 2 个按钮使用 2 个 segues 连接到同一个 viewController。在那个viewController 中,我需要检查单击了哪个按钮。所以实际上我需要检查使用/执行了哪个segue。如何在 viewControllers 类中检查这一点?我知道有 prepareForSegue 方法,但我不能将它用于我的目的,因为我需要将 prepareForSegue 放在 2 个按钮所在的类中,我不希望它在那里,但我想要它在viewControllers 类,因为我需要访问和设置该类中的一些变量。

【问题讨论】:

【参考方案1】:

你需要在第一个viewcontroller的prepareforsegue方法中设置第二个viewcontroller的变量。它是这样完成的:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if([segue.identifier isEqualToString:segueIdentifier1])
    
        SecondViewController *secondVC = (SecondViewController *)segue.destinationViewController;
        if(sender.tag == ...) // You can of course use something other than tag to identify the button
        
            secondVC.identifyingProperty = ...
        
        else if(sender.tag == ...)
        
            secondVC.identifyingProperty = ...
        
    

然后您可以在第二个 vc 中检查该属性以了解您是如何到达那里的。如果您在情节提要中为 2 个按钮创建了 2 个 segue,则仅 segue 标识符就足以设置相应的属性值。然后代码变成这样:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if([segue.identifier isEqualToString:segueIdentifier1])
    
        SecondViewController *secondVC = (SecondViewController *)segue.destinationViewController;
        secondVC.identifyingProperty = ...
    
    else if([segue.identifier isEqualToString:segueIdentifier2])
    
        SecondViewController *secondVC = (SecondViewController *)segue.destinationViewController;
        secondVC.identifyingProperty = ...
    

【讨论】:

我已经做到了,但是当我把这个: PageScrollViewController *controller = (PageScrollViewController *)segue.destinationViewController;控制器.startStory = YES;应用崩溃 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UIViewController setStartStory:]:无法识别的选择器发送到实例 0x9976420”*** 第一次抛出调用堆栈: 奇怪的部分是错误说明了“setStartStory”,但我从未使用过这个?我使用 startStory setStartStory 是为您的属性 startStory 自动生成的设置器。你合成 startStory 了吗? setStartStorystartStory 的 setter 方法,当你合成(在最新的 Xcode 中自动合成)属性时自动生成【参考方案2】:

所以首先你需要直接在storyborads中设置你的segues标识符,或者通过你的代码使用performSegueWithIdentifier方法。 独立于您选择的方式,您的视图控制器将触发以下方法,因此您需要覆盖它以了解哪个 segue 发送消息,您可以这样做:

 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender     
        if ([segue.identifier isEqualToString:@"ButtonSegueIdentifierOne"]) 
            // button 1
        
        if ([segue.identifier isEqualToString:@"ButtonSegueIdentifierTwo"]) 
            // button 2
        

【讨论】:

以上是关于如何检查使用了哪个 segue的主要内容,如果未能解决你的问题,请参考以下文章

uitableview中的多个segues

在 Swift 中使用 shouldPerformSegue() 检查字段后如何继续使用 segue

使用多个 Segue |如何使用 Cell 数据来执行特定的 Segue

segue 如何创建目标 ViewController?

使用自适应 segue 时如何获取对 UIPopoverController 的引用?

查找单击了哪个单元格并执行 Segue