iOS>> prepareForSegue>> IBOutlet更新不起作用?

时间:2013-12-23 13:17:09

标签: ios properties uiviewcontroller uistoryboardsegue iboutlet

我正在尝试从prepareForSegue方法中的第一个VC更新第二个VC中的Label。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    MYSecondViewController* secondVC = (MYSecondViewController*)segue.destinationViewController;
    secondVC.titleLabel.text = @"First VC Says: You Are Second!!"; //This doesn't work
    secondVC.dataPassString = @"First VC Says: You Are Second!!"; //This works + secondVC viewDidLoad
}

如果我直接更新标签,它不起作用。 如果我更新一个字符串属性然后将其分配给第二个VC viewDidLoad中的Label,它确实有效。

这是否意味着在prepareForSegue调用后第二个VC viewDidLoad方法尚未被调用?

是否调用了一些init方法(因此NSString对象可以通过)?如果是,哪一个?

有没有办法从第一个VC更新第二个VC中的IBOutlets?

2 个答案:

答案 0 :(得分:8)

简短的回答是:不要这样做。

您应该将另一个视图控制器的视图视为私有,并且永远不会尝试操纵它们。它打破了封装的OOD原则。

您要做的是将(字符串或其他类型)属性添加到目标视图控制器,并在prepareForSegue中设置THOSE。然后在目标视图控制器的viewWillAppear方法中,将这些属性值复制到视图控制器的视图中。

在您的情况下,datePassString属性正是您想要的。

这样,如果您在路上更改第二个视图控制器的结构,并决定将信息显示到其他视图,则不会破坏2个视图控制器之间的链接。您的目标视图控制器仍然可以从其源中获取数据,并使用它执行不同的操作。

P.S。正如另一张海报所说,设置secondVC.titleLabel.text失败的原因是在prepareForSegue中,目标视图控制器的视图尚未加载。

答案 1 :(得分:2)

如果您在“prepareForSegue”方法中添加此行:

if(!secondVC.titleLabel)
    NSLog(@"titleLabel is null and it likely hasn't been loaded yet")

您将看到视图尚未加载,直到它出现(在prepareForSegue之后发生)。这就是为什么你正在使用的datePassString属性正在工作,而IBOutlets在视图加载之前为空。