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

Posted

技术标签:

【中文标题】iOS >> prepareForSegue >> IBOutlet 更新不起作用?【英文标题】:iOS >> prepareForSegue >> IBOutlet Update Doesn't Work? 【发布时间】:2013-12-23 13:17:08 【问题描述】:

我正在尝试在 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?

【问题讨论】:

【参考方案1】:

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

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

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

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

这样,如果您以后更改第二个视图控制器的结构,并决定将信息显示到不同的视图,您就不会破坏两个视图控制器之间的链接。你的目标视图控制器仍然可以从它的源中获取数据,并用它做一些不同的事情。

附:正如另一位发帖者所说,设置 secondVC.titleLabel.text 失败的原因是在 prepareForSegue 中,目标视图控制器的视图尚未加载。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于iOS >> prepareForSegue >> IBOutlet 更新不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

有 iOS 9 项目支持 iOS 8

iOS - 地图

python学习之io模块

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

iOS >> UITableViewCell ImageView 属性 >> ContentMode 没有任何作用

iOS >> UILocalNotification 丢失了