簡體   English   中英

如何在iOS應用程序中處理模型類

[英]How to deal with model classes in iOS application

我是iOS應用程序開發的新手,但我正在努力學習如何以最佳方式處理Cocoa。

我試圖理解如何正確地保留和引用模型對象。

  1. 許多人說要編寫一個app delegate屬性來保存模型,然后通過app delegate singleton的便捷方法引用它。
  2. 其他人說在視圖控制器中“注入”只需要它所需的模型部分(或其子視圖需要),但我不明白如何做到這一點。 通過財產? 通過initWithModel:方法(在這種情況下,我怎么能說IB使用該方法?)
  3. 其他人再次說該模型應該是單身人士
  4. 而且,其他人說要使用全局變量(!)

你能給我一些提示(和代碼示例)嗎? 我想以適當的方式學習這些東西,考慮到我將很快走向核心數據。

摘要 :我仔細閱讀了主題“核心數據堆棧”放置在 Brad Larson建議的Cocoa / Cocoa Touch應用程序中的哪個方面 ,我寫了一個關於如何處理模型和不同視圖控制器的可能解決方案。 該解決方案不使用Core Data,但我相信相同的設計可能會應用於Core Data應用程序。

場景 :讓我們考慮一個簡單的應用程序,它存儲有關產品的信息,例如名稱,描述和價格/單位。 啟動后,應用程序會顯示一個產品列表(帶有UITableView); 當用戶點擊產品名稱時,應用程序會在另一個視圖中顯示產品詳細信息,並使用產品名稱更新導航欄。

架構這里的模型非常簡單:一個Product對象數組,每個對象都有一個名稱,一個描述和一個price屬性。

該應用程序有三個主要視圖,主要由Xcode的導航模板創建:UINavigationView(由UINavigationController管理,在app委托中實例化),默認的UITableView(由RootViewController管理,是UINavigationController顯示的第一個視圖)和一個DetailView(由我們必須編寫的DetailViewController類管理)。

讓我們從模型的角度看看大計划是什么:

  1. 該模型由Application委托實例化/加載為Product對象的NSMutableArray;
  2. 現在,指向模型的指針通過屬性傳遞給層次結構的第一個視圖控制器UITableViewController。 實際上,有人可能會爭辯說層次結構中的第一個控制器是UINavigationController,所以我們應該將引用傳遞給它並從它傳遞給UITableViewController但是...... Apple說UINavigationController不應該是子類,所以我們不能添加任何屬性/方法。 實際上它是有道理的,因為UINavigationController的責任始終只是可視化管理,而不是模型操作。
  3. 當用戶選擇UITableCell時,UITableViewController會創建一個新的DetailViewController(帶有關聯的DetailView),將單個選定的產品作為屬性傳遞,並將詳細信息視圖推送到UINavigation堆棧的頂部。

這里有一些代碼片段:

創建模型:

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM