1

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

这是我准备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标识符?

谢谢。

4

2 回答 2

3

您可以给目标视图控制器一个标识转场的属性,并在源视图控制器的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 标识符的视图控制器。如果您更改标识符或添加新标识符,您可能会忘记更新其中一个。

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

让我们用一个具体的例子。假设您的应用程序允许用户在朋友有孩子时向朋友发送卡片。所以你的主屏幕有三个按钮:“这是一个男孩!”、“这是一个女孩!”和“这是一只小狗!” 当用户单击这些按钮中的任何一个时,您希望转到用户可以输入消息的屏幕。您希望消息输入屏幕根据按下的按钮自定义主题:女孩的粉色心形、男孩的蓝色卡车和小狗的狗窝。

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

@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];
    }
}
于 2013-07-02T04:34:29.243 回答
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 属性声明为弱(仅当您正在传递视图控制器并且它仍在内存中时),即以模态方式呈现。

我建议安全地声明一个字符串属性并由previous/SourceVC 设置它。

于 2015-11-18T23:27:04.507 回答