Oha*_*gev 6 properties uiviewcontroller iboutlet ios uistoryboardsegue
我正在尝试从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
}
Run Code Online (Sandbox Code Playgroud)
如果我直接更新Label,它就不起作用.如果我更新一个字符串属性,然后将其分配给第二个VC viewDidLoad中的标签,它确实有效.
这是否意味着在prepareForSegue调用后第二个VC viewDidLoad方法尚未被调用?
是否调用了一些init方法(因此NSString对象可以通过)?如果是的话,哪一个?
有没有办法从第一个VC更新第二个VC中的IBOutlets?
简短的回答是:不要这样做.
您应该将另一个视图控制器的视图视为私有,并且永远不要尝试操纵它们.它打破了封装的OOD原则.
您要做的是将(字符串或其他类型)属性添加到目标视图控制器,并在prepareForSegue中设置THOSE.然后在目标视图控制器的viewWillAppear方法中,将这些属性值复制到视图控制器的视图中.
在您的情况下,datePassString属性正是您想要的.
这样,如果您在路上更改第二个视图控制器的结构,并决定将信息显示到其他视图,则不会断开2个视图控制器之间的链接.您的目标视图控制器仍然可以从其源中获取数据,并使用它执行不同的操作.
PS作为另一张海报说,设置secondVC.titleLabel.text失败的原因是在prepareForSegue中,目标视图控制器的视图尚未加载.
如果您在“”方法中添加这一行prepareForSegue:
if(!secondVC.titleLabel)
NSLog(@"titleLabel is null and it likely hasn't been loaded yet")
Run Code Online (Sandbox Code Playgroud)
您将看到视图在显示之前尚未加载(发生在 后prepareForSegue)。这就是为什么您正在使用的 datePassString 属性在 IBOutlet 为 null 时一直有效,直到加载视图为止。
| 归档时间: |
|
| 查看次数: |
1005 次 |
| 最近记录: |