2010-06-24 21 views
2

通過一些基礎知識通過iPhone的一些教程,我努力確定如何最好地構建我的代碼。我正在使用的這本書指出了諸如「你通常不會把它放在這裏,但是爲了權宜之計......」。那麼,我想知道「通常」會做什麼。如何最好地構建我的代碼爲基本的iPhone表/導航數據庫應用程序?

我的應用程序有點簡單 - 有一個表視圖,顯示對象列表,我們可以添加,刪除,編輯這些對象(我打算稍後提供更復雜的組織方案,但我會保持簡單得到一些工作)。

因此,我有一個RootViewController延伸UITableViewController。當點擊「添加」按鈕時,我將UIViewController的子類推入堆棧(這個類是我的對象的「添加/編輯」窗體)。我有一個簡單的數據結構風格的類來容納對象的字段。

本書中的應用程序基本上將數組放在RootViewController的內部,並使用對模型類的引用來表示「正在編輯的對象」。基本上,這些模型都包裝在視圖控制器中。這似乎是錯誤的。

所以,我的問題是:模型和管理它們的對象通常在哪裏生活?

而且,對此的答案取決於我如何存儲我的對象?我沒有用CoreData做太多工作,儘管我的計劃是使用它來保存我的對象。 XCode提供的鉤子和樣板是否會使其成爲不可發佈的?

最佳答案將指向一些最佳實踐類型的東西,我無法通過Google或Apple的Dev站點輕鬆找到這些東西。

回答

2

首先你對自己的直覺是正確的,這看起來是錯誤的。正如您所描述的,模型存儲在視圖控制器中。這是一個壞主意。通過這樣做,您違反了模型 - 視圖 - 控制器範例,這使您的代碼難以維護。

因此,您現在需要做的是將模型放在單獨的對象或對象樹中,或者更好地使用CoreData,這在內存管理方面也很棒。

正如你想要使用CoreData,你應該看看UIFetchedResultsController類,你將使用它從managedObjectContext獲取對象,這將是你的模型。

,你會怎麼做,在你的表視圖 - 細節編輯的例子是:

  1. 使用讀取請求,並將其設置在NSFetchedResultsController你持有作爲RootViewController的一個實例變量取表視圖的內容
  2. 如果項目被選中設置此RootViewController的作爲NSFetchedResultsController
  3. 的委託或添加按鈕被按壓推動你的細節視圖控制器在棧上,傳遞的對象,與它進行編輯,或零,如果它是一個新對象。還要將managedObjectContext傳遞給detailViewController。更新或創建對象。
  4. 在rootViewController中實現NSFetchedResultsController的委託方法,並在那裏重新加載表中的內容。

你得到的是一個很好和清晰的模型分離(CoreData的managedObjectContext)控制器(rootViewController和detailViewController)和你的觀點。如果您現在使用詳細視圖編輯條目,則會通過NSFetchedResultsController通知您的rootViewController並自動更新。你還得到的是,你的應用程序中的viewController中沒有強大的引用。

順便說一句,你在應用程序的委託中設置了你的CoreData的東西。在Xcode和ADC中有很多樣板代碼。查看Recipies應用[1],其中使用了我剛描述的這種方法。在Apple的開發者網站上也有一些關於CoreData的視頻。

[1]:http://developer.apple.com/iphone/library/samplecode/iPhoneCoreDataRecipes/Introduction/Intro.html CoreDataRecipies

相關問題