我有一個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是否已設置的測試將是錯誤的,並且不會顯示任何內容。或者這是不可能發生的?
或者,也許有更好的模式來加載視圖並將數據傳遞給它們來顯示。
感謝先進的喬納斯。
prodNameLbl在以下情況下獲取值集:[self.navigationController pushViewController:detailVC animated:YES];叫做。這是緊跟在detailVC.aProd = [_prod objectAtIndex:indexPath.row]; 所以我想我可以放心地假設,如果viewDidLoad被調用_concerts肯定會被設置並準備好被利用。 –
當然,一般不要認爲控制器已經準備好,直到ViewController的視圖屬性被訪問完畢。這通常是視圖第一次出現時是這樣,當你將它推入導航控制器時,它應該已經準備就緒。 在您的ViewController中偵聽的其他消息是awakeFromNib(詳情請參閱http://developer.apple.com/library/ios/#documentation/uikit/reference/NSObject_UIKitAdditions/Introduction/Introduction.html) – reddersky
awakeFromNib doesn'似乎在做伎倆。 從Apple的文檔中我得到:在iOS中,此消息僅發送給由nib加載代碼實例化的接口對象。它不會發送到文件所有者,第一響應者或任何其他佔位符對象。 所以它只被發送到由nib加載代碼實例化的接口對象。我不確定這是什麼意思? –