2011-12-04 70 views
2

我有一個UITableView通過它的navigationController加載一個新的viewcontroller。 此代碼放在了的tableView:didSelectRowAtIndexPath方法方法:使用數據加載自定義ViewController

ConcertDetailViewController *detailVC = [[ConcertDetailViewController alloc] initWithNibName:@"ConcertDetailViewController" bundle:nil]; 

的UITableView中有一個模式,我想送這個模型的元素到新創建的視圖控制器。

detailVC.aProd = [_prod objectAtIndex:indexPath.row]; 

當值設爲我想detailVC繪製屏幕上的數據。我認爲自定義setter,覆蓋由@synthesize生成的那個會起作用。

-(void)setaProd:(NSMutableDictionary *)aProd { 
_aProd = aProd; 
[self displayAProd]; 
} 

displayAProd只需要在aProd的價值觀念,是他們在屏幕上,或者更確切地說,我設置一個出口的一些價值,在我的筆尖文件中創建。

self.prodNameLbl.text = [_aProd objectForKey:@"name"]; 

這沒什麼特別的。但它不起作用。我想,爲什麼呢? 這是因爲setter執行的方式更快,然後將整個視圖加載到內存中。 如果我把self.prodNameLbl.text = @「something」;在viewDidLoad方法中,它在標籤中顯示正確的值。 快速的解決方法是查看是否已設置_concerts並從那裏調用displayAProd。在這裏,我懷疑自己是否是加載視圖的好方法。如果自定義設置器花費更長時間來執行加載視圖,會怎樣?查看_concerts是否已設置的測試將是錯誤的,並且不會顯示任何內容。或者這是不可能發生的?

或者,也許有更好的模式來加載視圖並將數據傳遞給它們來顯示。

感謝先進的喬納斯。

回答

0

問題是,當您從NIB加載視圖控制器時,在initWithNibName調用期間,IBOutlets將不會連接到您的UILabel和其他類似的屬性。

您需要等待viewDidLoad在detailVC上調用並從那裏調用[self displayAProd]。此時,連接將會完成。

做一個快速測試。在你的didSelectRowAtIndexPath方法中放置一個斷點,初始化detailVC後,檢查prodNameLbl是否爲null。

+0

prodNameLbl在以下情況下獲取值集:[self.navigationController pushViewController:detailVC animated:YES];叫做。這是緊跟在detailVC.aProd = [_prod objectAtIndex:indexPath.row]; 所以我想我可以放心地假設,如果viewDidLoad被調用_concerts肯定會被設置並準備好被利用。 –

+0

當然,一般不要認爲控制器已經準備好,直到ViewController的視圖屬性被訪問完畢。這通常是視圖第一次出現時是這樣,當你將它推入導航控制器時,它應該已經準備就緒。 在您的ViewController中偵聽的其他消息是awakeFromNib(詳情請參閱http://developer.apple.com/library/ios/#documentation/uikit/reference/NSObject_UIKitAdditions/Introduction/Introduction.html) – reddersky

+0

awakeFromNib doesn'似乎在做伎倆。 從Apple的文檔中我得到:在iOS中,此消息僅發送給由nib加載代碼實例化的接口對象。它不會發送到文件所有者,第一響應者或任何其他佔位符對象。 所以它只被發送到由nib加載代碼實例化的接口對象。我不確定這是什麼意思? –