传递的变量返回null

时间:2013-08-24 13:31:19

标签: ios objective-c null parameter-passing

当我将变量传递给另一个视图时,它总是返回'null'

代码 Screen1.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"gotoScreen2"])
    {
        Screen2 *screen = [[Screen2 alloc] initWithNibName:nil bundle:nil];
        Screen2.passedVar = currentVar;

        NSLog(@"%@",currentVar); //these 2 line both return the correct var!
        NSLog(@"%@",Screen2.passedVar);
    }
}

代码 Screen2.h

@property (nonatomic,copy) NSString *passedVar;

代码 Screen2.m

@synthesize passedVar;
...
NSLog(@"%@",passedVar); //This returns 'null'

2 个答案:

答案 0 :(得分:1)

首先,行Screen2.passedVar = currentVar;不正确,因为类不能有实例变量。但即使你用看似正确的screen.passedVar = currentVar;替换了这一行,它也不会像你期望的那样工作。

您的错误是您正在Screen2中创建目标视图控制器perpareForSegue:sender:的新实例。系统将忽略此对象,并在方法返回时将其删除。

当您要求它执行segue时,系统会为您创建Screen2的实例。您可以通过prepareForSegue:sender:参数在segue中访问此实例:

Screen2 *screen = (Screen2 *)segue.destinationViewController;
screen.passedVar = currentVar;

答案 1 :(得分:0)

类不能有ivars,并且你没有将ivar分配给对象(也就是类实例),而是分配给没有意义的类本身。试试这个:

Screen2 *screen = [[Screen2 alloc] initWithNibName:nil bundle:nil];
screen.passedVar = currentVar;
NSLog(@"%@",screen.passedVar);

还要记住screen指向新创建的Screen2对象,它与正在呈现的控制器没有任何关系。