2015-10-13 49 views
0
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"CreateUser"]) 
    { 
     CreateUserViewController *createUserVC = segue.destinationViewController; 
     createUserVC.email.text = @"something from fb"; 
     createUserVC.age.text = @"99"; 
     createUserVC.name.text = @"Name from fb";  
    } 
} 

我從我的「StartVC」中調用這個segue。我有另一個CreateUserViewController,其中包含不同的文本字段來保存用戶的詳細信息。我不知道爲什麼這不起作用,有人可以啓發我嗎? 通過斷點我可以看到代碼已經運行,並且顯示了創建用戶vc,但是這些字段是空的(僅包含佔位符;我不會寫空白字符串= @「」或類似的東西)在prepareForSegue中傳遞參數:

回答

1

您不應該嘗試對另一個視圖控制器的視圖對象進行更改。

這違反了封裝原則,這是面向對象設計的重要部分。 (這意味着代碼的其他部分在視圖控制器外部依賴於視圖控制器的呈現以便工作。如果您決定稍後移動視圖,則必須更改視圖控制器外部的代碼。這很糟糕。)

這也是你的代碼無法工作的原因。

相反,您應該在目標視圖控制器中設置屬性並設置它們。然後在目標視圖控制器的viewDidLoad(只調用一次)或viewWillAppear(每次VC即將顯示時調用)中,根據需要將屬性中的值安裝到您的視圖中。

當時prepareForSegue被稱爲目標視圖控制器的視圖尚未加載。如果你看他們,你會發現他們是零。這就是爲什麼你的代碼不工作。

你可以做個試驗:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"CreateUser"]) 
    { 
     CreateUserViewController *createUserVC = segue.destinationViewController; 
     NSLog(@"createUserVC.email = %@", createUserVC.email); 
     NSLog(@"createUserVC.age = %@", createUserVC.age); 
     NSLog(@"createUserVC.name = %@", createUserVC.name); 
    } 
} 

你會看到,所有的網點都是零。

+0

只是爲了簡化:你說我應該做的屬性(讓時間是字符串)在我createuserVC,然後將根據這些字符串文本字段,createuserVC負載時?林不知道我明白爲什麼從外部訪問一個說UIView屬性不同於訪問一些其他類型(在這種情況下NSString) – DevilInDisguise

+0

因爲屬性是一個公共接口,打算從外部使用。視圖控制器內的視圖是演示文稿。這是你的VC看起來的樣子。如果外部代碼依賴於視圖控制器的視圖層次結構,那麼如果進行佈局更改,則會破壞該依賴關係。 –

+0

雖然我以另一種方式做它:改變VC從外部看起來如何 – DevilInDisguise