如何从多个segue识别destinationVC上的segue标识符?

时间:2013-07-02 03:00:09

标签: cocoa-touch segue uistoryboardsegue

我有这个视图,其上有三个UIButton,每个UIButton都有一个推送到一个VC的segue标识符。

这是我准备segue的代码

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Button 1"]) {
        [[segue destinationViewController] setBudgetOrderingViewController:self];
    } else if ([segue.identifier isEqualToString:@"Button 2"]) {
        [[segue destinationViewController] setBudgetOrderingViewController:self];
    } else if ([segue.identifier isEqualToString:@"Button 3"]) {
        [[segue destinationViewController] setBudgetOrderingViewController:self];
    }
}

有没有办法知道在destinationVC上加载destinationVC的segue标识符是什么?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以为目标视图控制器提供标识segue的属性,并在源视图控制器的prepareForSegue:sender:方法中设置该属性。例如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    DestinationViewController *dvc = segue.destinationViewController;
    dvc.segueIdentifier = segue.identifier;
    if ([segue.identifier isEqualToString:@"Button 1"]) {
        [dvc setBudgetOrderingViewController:self];
    } else if ([segue.identifier isEqualToString:@"Button 2"]) {
        [dvc setBudgetOrderingViewController:self];
    } else if ([segue.identifier isEqualToString:@"Button 3"]) {
        [dvc setBudgetOrderingViewController:self];
    }
}

然而,这实际上并不是一个非常好的设计。现在您有两个需要知道所有segue标识符的视图控制器。如果更改标识符或添加新标识符,您可能会忘记更新其中一个标识符。

更好的设计是让源视图控制器告诉目标视图控制器该做什么。

让我们使用一个具体的例子。假设您的应用允许用户在朋友生孩子时将卡片发送给朋友。所以你的主屏幕有三个按钮:“它是一个男孩!”,“它是一个女孩!”,“它是一只小狗!”当用户点击任何这些按钮时,你想要segue到用户可以输入消息的屏幕。您希望根据按下的按钮自定义消息输入屏幕:女孩的粉红色心脏,男孩的蓝色卡车和小狗的狗窝。

为目标视图控制器提供以下每种可能性的消息:

@interface MessageComposerViewController : UIViewController

@property (nonatomic, weak) id<MessageComposerViewControllerDelegate> delegate;

- (void)useGirlTheme;
- (void)useBoyTheme;
- (void)usePuppyTheme;

@end

然后,在主屏幕视图控制器的prepareForSegue:sender:中,测试标识符并将相应的消息发送到目标视图控制器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    MessageComposerViewController *dvc = segue.destinationViewController;
    dvc.delegate = self;
    if ([segue.identifier isEqualToString:@"Girl"]) {
        [dvc useGirlTheme];
    }
    else if ([segue.identifier isEqualToString:@"Boy"]) {
        [dvc useBoyTheme];
    }
    else if ([segue.identifier isEqualToString:@"Puppy"]) {
        [dvc usePuppyTheme];
    }
}

答案 1 :(得分:1)

//Declare a string Property in Destination View Controller
@property (strong, nonatomic) NSString *Segue_Listner;

//In Source ViewController perform segue method
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier]isEqualToString:@"destinationVC"]) {
        DestinationVC *dvc = [segue destinationViewController];
        dvc.Segue_Listner = @"somevalue";
 }

传递整个视图控制器是可以的,但是如果视图控制器对象的大小太大,我们必须要小心。 还要确保将destinationVC属性声明为弱(仅在您通过视图控制器并且仍在存储器中时),即以模态方式呈现。

我建议安全地声明一个字符串属性并使其由之前的/ SourceVC设置。