2013-12-23 50 views
6

我試圖在prepareForSegue方法中的第一個VC中更新第二個VC中的標籤。iOS >> prepareForSegue >> IBOutlet更新不起作用?

-(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?

回答

2

如果在此行中添加你的「prepareForSegue」的方法:

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

你會看到該視圖還沒有被加載,直到它的時候,它出現(這prepareForSegue後發生)。這就是爲什麼你正在使用的datePassString屬性正在工作,而IBOutlets是null,直到加載視圖。

8

簡短的回答是:不要這樣做。

您應該將另一個視圖控制器的視圖視爲私有視圖,而不要試圖操縱它們。它打破了封裝的OOD原則。

你想要做的是添加(字符串或其他類型)屬性到你的目標視圖控制器,並在prepareForSegue中設置THOSE。然後在目標視圖控制器的viewWillAppear方法中,將這些屬性值複製到視圖控制器的視圖中。

在你的情況下,datePassString屬性正是你想要的。

這樣,如果您在路上更改第二個視圖控制器的結構,並決定將信息顯示到其他視圖,則不會中斷兩個視圖控制器之間的鏈接。您的目標視圖控制器仍然可以從其源代碼獲取數據,並執行與其不同的操作。

P.S.正如其他海報所說,設置secondVC.titleLabel.text失敗的原因是在prepareForSegue中,目標視圖控制器的視圖尚未加載。