艾倫,
你的聲明「爲了得到它顯示在任何但是第一個新的數據」我擔心 - 因爲它告訴我,你有可能有一個DetailsViewController實例。
在您的第一個表視圖ItemsViewController中,您可能有一個didSelectRowAtIndexPath:
方法,用於將DetailsViewController
推送到UINavigationController
堆棧。
我如何解決這個問題是每次我的用戶在視圖之間輕敲時簡單地創建/銷燬新的DetailsViewController。所以,我經常didSelectRowAtIndexPath:
看起來像:
- (void) didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
NSInteger selectedRow = indexPath.row;
// Create a new view controller
DetailsViewController *tmpVC = [[DetailsViewController alloc] initWithNibName:@"foo" bundle:nil];
// Tell our new view controller what data it should be using
tmpVC.tableData = [self.someArrayOfData objectAtIndex:selectedRow];
// Push view controller and release it
[self.navigationController pushViewController:tmpVC animated:YES];
[tmpVC release];
}
此示例假設您擁有所有必要爲您的ItemsViewController兩個視圖控制器的數據 - 可能並非如此..?
無論如何,通過這樣做,您的DetailsViewController會自動加載數據。當你點擊「後退」返回到ItemsViewController時,UINavigationController會釋放它並銷燬它。然後,當用戶點擊不同的單元格時,我們再次運行此代碼,創建一個全新的數據控制器 - 當然,當它顯示時,它會自動加載數據 - 它以前從未顯示過。
它聽起來像你可能會在你的代碼中做的是保留DetailsViewController
作爲ItemsViewController
類的屬性,然後重新使用該對象。如果你關心分配(例如,如果它是一個非常「繁重」的分配來創建DetailsViewController),那麼這也可以起作用,但是我認爲調用reloadData的最佳位置不在類內部 - 但而不是來自ItemsViewController的didSelectRowAtIndexPath:
方法。
我推動創建/銷燬方法而不是「flyweight模式」方法的原因是它使代碼更加分離 - 視圖控制器之間的聯繫越少越好。當然,ItemsViewController將始終依賴和了解DetailsViewController,但它不一定必須是另一種方式 - 如果將reloadData調用添加到viewWillAppear:animated:
,則隱式地在兩者之間添加了非代碼依賴關係。您知道當ItemsViewController是導航堆棧中的「父」時,這是正確的行爲 - 但是如果您突然開始在應用的其他部分重新使用該視圖而不需要重新加載,該怎麼辦?這是一個性能問題,而且,它是一種隱藏的依賴性,可能最終會在一天內出現一個令人討厭的跟蹤錯誤。所以,如果確實需要只有1個DetailsViewController(而不是每次重新創建它的第一個想法),我會保持細節愚蠢並使項目包含所有複雜性。
從什麼是上面這個代碼段? ItemsView或DetailsView ...你說他們都是桌子。 – 2010-10-31 05:05:41
對不起,我應該提到。這是來自DetailsView。 – Alan 2010-11-01 10:46:32