使用Segue不工作在视图之间传递数据



我有一个带有按钮的登录页面。当按下按钮时,我想使用Segue切换视图,最重要的是,传递数据。

我有这个代码:

TabBarViewController *tvc = [[TabBarViewController alloc] init];
NSLog(@"BEFORE: %@", tvc.user); //OUTPUTS NULL
tvc.user = @"HELLO";
NSLog(@"AFTER: %@", tvc.user); //OUTPUTS HELLO
[self performSegueWithIdentifier:@"gotomain" sender:sender];

它不起作用。我试图对tvc类中的user属性执行NSLog,但它为NULL。

然而,这个附在按钮上的代码是有效的:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"meeh"] ) {
TabBarViewController *tvc =[segue destinationViewController];
NSLog(@"BEFORE: %@", tvc.user);
tvc.user = @"Hello";
NSLog(@"AFTER: %@", tvc.user);
}
}

当我对tvc类中的user属性执行NSLog时,我会得到"Hello",因此它可以工作。

我想使用第一个选项performSegueWithIdentifier,因为这只允许我在满足条件(即登录是否有效)的情况下转到下一个视图。但是,我无法正确传递变量。有人能告诉我我做错了什么吗?

感谢您的帮助。谢谢

您需要[self performSegueWithIdentifier:@"gotomain" sender:sender];prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

您还需要在performSegueWithIdentifier之前检查tvc.user

if ([tvc.user isEqualToString:@"valid_username_here"]) {
[self performSegueWithIdentifier:@"gotomain" sender:sender];
}

您的第一个代码示例不起作用,因为您正在使用alloc init创建TabBarViewController的新实例——这不是您的故事板中的实例。您似乎对性能SegueWithIdentifier和prepareForSegue的用途感到困惑。prepareForSegue在segue启动时被调用——无论它是如何启动的,无论是在代码中还是直接从UI元素中启动。这是您应该用来传递数据的方法,因为它允许您访问destinationViewController。

performSegueWithIdentifier触发一个segue。如果你想要一个有条件的segue,你可以将故事板中的segue从一个控制器连接到另一个控制器——只有在代码中调用performSegueWithIdentifier(你可以在满足你想要的任何条件后执行)之前,这个segue才会执行。如果您从按钮(或tableViewCell)连接segue,则会为您调用performSegueWithIdentifier(您自己不调用它),因此您不能在segue上设置任何条件——它将在您触摸按钮时立即执行。

要创建视图控制器对象,有两种方法,一种在下面提到

TabBarViewController *tvc = (TabBarViewController *)[mainStoryboard
instantiateViewControllerWithIdentifier: @"storyboardIdOfTabBarViewController"];

在这里您可以传递值tvc.user = @"Hello"

另一种方法是使用performSegueWithIdentifier方法。如果要使用performSegueWithIdentifier方法,则必须使用prepareForSegue委托方法将值传递给destinationViewController。对于条件导航,您应该设置从一个视图控制器到另一个视图控件的分段。您必须在prepareForSegue方法中使用segue.identifier,以便从segue.destinationViewController属性中获得destinationViewController的对象。

最新更新