2015-10-13 90 views
0
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"CreateUser"]) 
    { 
     CreateUserViewController *createUserVC = segue.destinationViewController; 
     createUserVC.email.text = @"something from fb"; 
     createUserVC.age.text = @"99"; 
     createUserVC.name.text = @"Name from fb";  
    } 
} 

我从我的“StartVC”中调用这个segue。我有另一个CreateUserViewController,其中包含不同的文本字段来保存用户的详细信息。我不知道为什么这不起作用,有人可以启发我吗? 通过断点我可以看到代码已经运行,并且显示了创建用户vc,但是这些字段是空的(仅包含占位符;我不会写空白字符串= @“”或类似的东西)在prepareForSegue中传递参数:

回答

1

您不应该尝试对另一个视图控制器的视图对象进行更改。

这违反了封装原则,这是面向对象设计的重要部分。 (这意味着代码的其他部分在视图控制器外部依赖于视图控制器的呈现以便工作。如果您决定稍后移动视图,则必须更改视图控制器外部的代码。这很糟糕。)

这也是你的代码无法工作的原因。

相反,您应该在目标视图控制器中设置属性并设置它们。然后在目标视图控制器的viewDidLoad(只调用一次)或viewWillAppear(每次VC即将显示时调用)中,根据需要将属性中的值安装到您的视图中。

当时prepareForSegue被称为目标视图控制器的视图尚未加载。如果你看他们,你会发现他们是零。这就是为什么你的代码不工作。

你可以做个试验:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"CreateUser"]) 
    { 
     CreateUserViewController *createUserVC = segue.destinationViewController; 
     NSLog(@"createUserVC.email = %@", createUserVC.email); 
     NSLog(@"createUserVC.age = %@", createUserVC.age); 
     NSLog(@"createUserVC.name = %@", createUserVC.name); 
    } 
} 

你会看到,所有的网点都是零。

+0

只是为了简化:你说我应该做的属性(让时间是字符串)在我createuserVC,然后将根据这些字符串文本字段,createuserVC负载时?林不知道我明白为什么从外部访问一个说UIView属性不同于访问一些其他类型(在这种情况下NSString) – DevilInDisguise

+0

因为属性是一个公共接口,打算从外部使用。视图控制器内的视图是演示文稿。这是你的VC看起来的样子。如果外部代码依赖于视图控制器的视图层次结构,那么如果进行布局更改,则会破坏该依赖关系。 –

+0

虽然我以另一种方式做它:改变VC从外部看起来如何 – DevilInDisguise