iOS>&燃气轮机;准备工作>&燃气轮机;IBOutlet更新没有';不行?

iOS>&燃气轮机;准备工作>&燃气轮机;IBOutlet更新没有';不行?,ios,properties,uiviewcontroller,uistoryboardsegue,iboutlet,Ios,Properties,Uiviewcontroller,Uistoryboardsegue,Iboutlet,我正在尝试在prepareForSegue方法中从第一个VC更新第二个VC中的标签 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { MYSecondViewController* secondVC = (MYSecondViewController*)segue.destinationViewController; secondVC.titleLabel.text = @"First VC

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

-(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中的标签,则它确实有效

这是否意味着在prepareForSegue调用第二个VC viewDidLoad方法时还没有调用

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


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

如果您在“
prepareforsgue
”方法中添加这一行:


您将看到视图直到出现时才被加载(发生在
prepareforsgue
之后)。这就是为什么您正在使用的datePassString属性在加载视图之前,当IBOutlets为空时仍然有效。

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

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

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

在您的例子中,datePassString属性正是您想要的

这样,如果您沿路更改了第二个视图控制器的结构,并决定将信息显示到其他视图,则不会断开两个视图控制器之间的链接。您的目标视图控制器仍然可以从其源获取数据,并对其执行不同的操作

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

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