[英]How to deal with model classes in iOS application
我是iOS應用程序開發的新手,但我正在努力學習如何以最佳方式處理Cocoa。
我試圖理解如何正確地保留和引用模型對象。
你能給我一些提示(和代碼示例)嗎? 我想以適當的方式學習這些東西,考慮到我將很快走向核心數據。
摘要 :我仔細閱讀了主題“核心數據堆棧”放置在 Brad Larson建議的Cocoa / Cocoa Touch應用程序中的哪個方面 ,我寫了一個關於如何處理模型和不同視圖控制器的可能解決方案。 該解決方案不使用Core Data,但我相信相同的設計可能會應用於Core Data應用程序。
場景 :讓我們考慮一個簡單的應用程序,它存儲有關產品的信息,例如名稱,描述和價格/單位。 啟動后,應用程序會顯示一個產品列表(帶有UITableView); 當用戶點擊產品名稱時,應用程序會在另一個視圖中顯示產品詳細信息,並使用產品名稱更新導航欄。
架構這里的模型非常簡單:一個Product對象數組,每個對象都有一個名稱,一個描述和一個price屬性。
該應用程序有三個主要視圖,主要由Xcode的導航模板創建:UINavigationView(由UINavigationController管理,在app委托中實例化),默認的UITableView(由RootViewController管理,是UINavigationController顯示的第一個視圖)和一個DetailView(由我們必須編寫的DetailViewController類管理)。
讓我們從模型的角度看看大計划是什么:
這里有一些代碼片段:
創建模型:
// SimpleModelAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// products is a protected ivar
products = [[NSMutableArray alloc] init];
Product *p1 = [[Product alloc] initWithName:@"Gold" andDescription:@"Expensive metal" andUnitPrice:100];
Product *p2 = [[Product alloc] initWithName:@"Wood" andDescription:@"Inexpensive building material" andUnitPrice:10];
[products addObject:p1];
[products addObject:p2];
[p1 release];
[p2 release];
// Passing the model reference to the first shown controller
RootViewController *a = (RootViewController*)[self.navigationController.viewControllers objectAtIndex:0];
a.products = products;
// Add the navigation controller's view to the window and display
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
- (void)dealloc
{
// The app delegate is the owner of the model so it has to release it.
[products release];
[_window release];
[_navigationController release];
[super dealloc];
}
RootViewController可以接收模型引用,因為它具有NSMutableArray屬性:
// RootViewController.h
#import <UIKit/UIKit.h>
@interface RootViewController : UITableViewController
@property (nonatomic, retain) NSMutableArray *products;
@end
當用戶點擊產品名稱時,RootViewController將實例化一個新的DetailViewController並再次使用屬性將對單個產品的引用傳遞給它。
// RootViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
// Passing the model reference...
detailViewController.product = [products objectAtIndex:indexPath.row];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
}
最后,DetailViewController顯示了在viewDidLoad方法中設置其出口的模型信息。
// DetailViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = product.name;
self.descriptionLabel.text = product.description;
self.priceLabel.text = [NSString stringWithFormat:@"%.2f eur", product.unitPrice];
}
您可以在此處下載完整項目: http : //dl.dropbox.com/u/1232650/linked/stackoverflow/SimpleModel.zip
我非常感謝對我的解決方案的任何評論,我渴望學習;)
更有經驗的同事建議在AppDelegate中擁有相關屬性。 IMO最好在特定控制器中使用特定的模型集。
我也是個菜鳥,但這就是我的所作所為。 它最像#2。
在applicationDidFinishLaunching中,應用程序委托創建模型的實例。
我的視圖控制器聲明了一個指向模型的屬性,但類型是一個協議(在我的例子中是id <GameModel>
。協議中的許多屬性都被聲明為readonly。
在applicationDidFinishLaunching中,應用程序委托將屬性設置為指向它創建的模型。
我不喜歡的:
一。 您的視圖控制器不應該知道您的應用程序委托的結構。 您可以在另一個應用程序中重用相同的視圖控制器,並使用不同的應用程序委托類型。 您可以對視圖控制器代碼進行簡單的更改來修復它,或者還有其他方法來解決它,但為什么要讓它變得困難?
三。 我不像大多數人那樣喜歡單身人士。 問題是他們是單身。 如果您想加載多個模型怎么辦?
四。 ?!?!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.