我有这个视图,其上有三个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标识符是什么?
感谢。
答案 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设置。