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

时间:2013-12-18 03:12:13

标签: ios objective-c properties 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类的用户属性上执行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,当且仅当条件满足时 - 即登录是否有效。但是,我无法正确传递变量。谁能告诉我我做错了什么?

帮助表示赞赏。感谢。

3 个答案:

答案 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}}属性。