2013-06-01 67 views
1

我有一個正在加載到UIViewScroll的詳細視圖。作爲將其加載到滾動視圖中的一部分,我在細節視圖上設置了一些屬性,例如按鈕(UIButton)和旅程(NSString)。訪問viewDidLoad中的屬性vs viewWillAppear vs viewDidAppear

[controller.button setTitle:text forState:UIControlStateNormal]; 
[controller setTrip:[tripIDs objectForKey:[sortedTrips objectAtIndex:page]]]; 

現在在細節控制器我嘗試三種不同的方法

- (void)viewDidLoad 
- (void)viewWillAppear:(BOOL)animated 
- (void)viewDidAppear:(BOOL)animated 
{ 
     NSLog(@"Button text %@",[[[self button] titleLabel]text]); 
     NSLog(@"Trip text %@",[self trip] text]);  
} 

閱讀這些屬性我只得到屬性值,當我在viewDidAppear閱讀,爲的viewDidLoad和viewWillAppear中我得到的是空。

這是爲什麼?還有,我應該在哪裏讀取和寫入這些細節視圖屬性之前它們出現在屏幕上,以便用戶在視圖加載後看不到文本更改?

感謝您的幫助!

添加行程聲明從細節或者Controller.h

@property (nonatomic, strong) NSString *trip; 
+0

您是否正確連接插座? –

+0

是的,IBOutlets連接到正確的XIB控件 – FireFly

回答

0

關於UIButton問題,問題是,你不能引用到控制器的意見控件之前viewDidLoad。因此,如果您創建的控制器比嘗試立即設置按鈕的標題,例如,它不會工作,因爲該視圖尚未創建。實際上,如果您在執行setTitle方法調用時查看controller.button的值,我懷疑您會看到它是nil。底線,一個視圖控制器不應該嘗試訪問屬於另一個視圖控制器的視圖控件。

您需要做的是在您首次實例化視圖控制器時設置的目標控制器中創建NSString屬性。然後viewDidLoad應該執行setTitle,將標題設置爲您在NSString屬性中存儲的值。

關於你trip變量,它很難弄清楚發生了什麼事情在那裏,因爲你的setTrip方法(這表明tripNSString不與你的trip財產NSLog語句組成的調用。忽略了一個事實,你在行程的NSLog不匹配],您還使用一個text方法是你會做什麼,如果tripUILabel,例如但是NSString對象沒有一個text方法。您可能需要與我們分享您的trip物業聲明,以幫助您更多地瞭解在一個。但是,如果它也是IBOutlet,那麼問題可能與我之前關於button的討論相同。

回到關於viewDidLoad v viewWillAppearviewDidAppear的問題,這真的沒有關係。你們的房產應該可以在三種房屋中使用。作爲一個慣例,人們通常使用viewDidLoad,除非需要別的東西(例如定時器或某些動畫通常最好在viewDidAppear中完成),但是您沒有明確表示viewDidLoad會不會很好這個案例。

但正如我所說的,我懷疑問題是您的代碼創建controller也試圖訪問它的一些IBOutlet對象,你不能這樣做。或者,可能你的網點沒有正確連接。

+0

感謝您的提示。更改了代碼以從父控制器傳遞NSString到詳細控制器。向詳細控制器添加了'@property(nonatomic,strong)NSString * buttonLabel'。然後調用'[controller setButtonLabel:destinationToText]'將其設置在父控制器中。接下來在詳細控制器的viewDidLoad'[[self button] setTitle:buttonLabel forState:UIControlStateNormal]'中。當我檢查buttonLabel在viewDidLoad中仍然爲零時。但是當我做'[[self button] setTitle:buttonLabel forState:UIControlStateNormal]'的用戶界面填充buttonLabel。魔法? – FireFly

+0

行程被聲明爲@property(nonatomic,strong)NSString * trip; – FireFly

+0

@FireFly關於'buttonLabel'是'nil'的註釋,我不會如果你既定義了@屬性又顯式聲明瞭一個類實例變量。你不應該爲你的屬性聲明實例變量,而是讓編譯器爲你合成這些變量。或者使用'@synthesize buttonLabel = _buttonLabel;'或者完全省略@ @ synthesize'語句(在這種情況下,它會執行相同的操作,自動合成具有前導下劃線的ivar)。 – Rob

相關問題