我有一个带有按钮的登录页面。当按下按钮时,我想使用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类的用户属性上执行NSLog
,它是NULL。
但是,附加到Button的代码有效:
-(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类的用户属性上NSLog
时,我得到“Hello”,因此它可以工作。
我想使用第一个选项performSegueWithIdentifier
,因为这样我只能转到下一个View,当且仅当条件满足时 - 即登录是否有效。但是,我无法正确传递变量。谁能告诉我我做错了什么?
帮助表示赞赏。感谢。
答案 0 :(得分:0)
您需要[self performSegueWithIdentifier:@"gotomain" sender:sender];
和prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
。
您还需要在tvc.user
之前检查performSegueWithIdentifier
。
if ([tvc.user isEqualToString:@"valid_username_here"]) {
[self performSegueWithIdentifier:@"gotomain" sender:sender];
}
答案 1 :(得分:0)
您的第一个代码示例不起作用,因为您正在使用alloc init创建TabBarViewController的新实例 - 这不是故事板中的实例。您似乎对performSegueWithIdentifier和prepareForSegue用于什么感到困惑。在启动segue时调用prepareForSegue - 无论它是如何启动的,无论是在代码中还是直接从UI元素启动。这是您应该用来传递数据的方法,因为它允许您访问destinationViewController。
performSegueWithIdentifier触发segue。如果你想要一个条件segue,你可以将故事板中的segue从一个控制器连接到另一个控制器 - 直到你在代码中调用performSegueWithIdentifier(你可以在你想要满足的任何条件之后,你可以做到这一点)来执行这个segue )。如果从按钮(或tableViewCell)连接segue,则会为您调用performSegueWithIdentifier(您不自己调用它),因此您无法在segue上设置任何条件 - 它将立即执行你按下按钮。
答案 2 :(得分:0)
要创建视图控制器对象,您有两种方法,一种在下面提到
TabBarViewController *tvc = (TabBarViewController *)[mainStoryboard
instantiateViewControllerWithIdentifier: @"storyboardIdOfTabBarViewController"];
您可以在此处传递值tvc.user = @"Hello"
。
另一种方法是使用performSegueWithIdentifier
方法。如果您想使用performSegueWithIdentifier
方法,则必须使用prepareForSegue
委托方法将值传递给destinationViewController
。对于条件导航,您应该将segue从一个viewcontroller设置为另一个viewcontroller。您必须使用segue.identifier
方法中的prepareForSegue
,以便从{{destinationViewController
获取segue.destinationViewController
的对象1}}属性。