gpt4 book ai didi

iphone - 如何处理 iOS 应用程序中的模型类

转载 作者:IT王子 更新时间:2023-10-29 08:15:48 25 4
gpt4 key购买 nike

我是 iOS 应用程序开发的新手,但我正在努力学习如何以最佳方式处理 Cocoa。

我在尝试了解如何正确保存和引用模型对象时遇到了困难。

  1. 很多人说要编写一个应用程序委托(delegate)属性来保存模型,然后通过应用程序委托(delegate)单例的便捷方法引用它。
  2. 其他人说只在 View Controller 中“注入(inject)”它需要的模型部分(或其 subview 需要),但我不明白如何做到这一点。通过属性(property)?通过 initWithModel: 方法(在这种情况下,我如何告诉 IB 使用该方法?)
  3. 其他人又说模型应该是单例
  4. 再一次,其他人说要使用全局变量 (!)

你能给我一些提示(和代码示例)吗?我想以正确的方式学习这些东西,考虑到我很快就会转向 Core Data。

最佳答案

摘要:我仔细看了题目Where to place the "Core Data Stack" in a Cocoa/Cocoa Touch application Brad Larson 建议,我写了一个关于如何处理模型和不同 View Controller 的可能解决方案。该解决方案不使用 Core Data,但我相信相同的设计可以应用于 Core Data 应用程序。

场景:让我们考虑一个简单的应用程序,它存储有关产品的信息,例如名称、描述和价格/单位。启动后,应用程序会显示产品列表(带有 UITableView);当用户点击产品名称时,应用程序会在另一个 View 中显示产品详细信息,并使用产品名称更新导航栏。

架构 这里的模型非常简单:一组 Product 对象,每个对象都有名称、描述和价格属性。

应用程序有三个主要 View ,主要由 Xcode 的 Navigation 模板创建:一个 UINavigationView(由 UINavigationController 管理,在应用程序委托(delegate)中实例化),默认 UITableView(由 RootViewController 管理,它是第一个显示的 View UINavigationController)和一个 DetailView(由我们必须编写的 DetailViewController 类管理)。

让我们从模型的角度看看大计划是什么:

  1. 模型由 Application delegate 实例化/加载为 Product 对象的 NSMutableArray;
  2. 指向模型的指针现在通过属性传递给层次结构的第一个 View Controller UITableViewController。实际上,有人可能会争辩说层次结构中的第一个 Controller 是 UINavigationController,因此我们应该将对它的引用传递给 UITableViewController 但是...Apple 说 UINavigationController 不应该被子类化,所以我们不能添加任何属性/方法。实际上这是有道理的,因为 UINavigationController 的职责始终只是可视化管理,而不是模型操作。
  3. 当用户选择一个 UITableCell 时,UITableViewController 会创建一个新的 DetailViewController(带有关联的 DetailView),将单个选定的产品作为属性传递,并将 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 在 vi​​ewDidLoad 方法中显示设置其导出的模型信息。

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

我非常感谢任何对我的解决方案的评论,我渴望学习 ;)

关于iphone - 如何处理 iOS 应用程序中的模型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7179236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com