关于 iPhone 应用程序结构的问题 - 核心数据、视图、模态视图等

Posted

技术标签:

【中文标题】关于 iPhone 应用程序结构的问题 - 核心数据、视图、模态视图等【英文标题】:Questions about iPhone app structure - Core Data, Views, Modal Views etc 【发布时间】:2010-11-03 15:22:21 【问题描述】:

大约一个月前,我和妻子想出了一个关于 iPhone 应用程序的好主意,因此我开始从用户的角度考虑该应用程序的工作方式,大约一周前,我第一次打开了 XCode并开始发展。

在我过于拘泥于应用程序的编写之前,我想确保我的一些关键概念清晰,特别是与架构相关的概念。

仅供参考,作为一项原则,我想尝试以编程方式(特别是 UI)创建尽可能多的应用程序,以便对正在发生的事情有透彻的了解。稍后我可能会使用 IB 作为加速 UI 开发的工具(目前适用,因为我使用的是 TableViews 而不是静态视图)。

视图控制器

所以 UINavigationController 通常不被子类化,而是作为 AppDelegate 中的属性创建的,并且是 MainWindow.xib 的主要“子视图”。

UINavigationController 控制视图堆栈,通常由根视图控制器启动。

导航控制器通常在当前/顶部视图控制器中作为 [self navigationcontroller] 被引用和发送消息,它是 UIViewController 父类的只读属性。

核心数据

托管对象上下文是访问模型中数据的主要控制点,但它通常不直接使用,而是使用获取请求返回数据对象的数组、集合或字典,然后由视图控制器来呈现和操作数据。

上下文作为应用程序委托中的属性创建,然后在启动时传递给根视图控制器,根视图控制器本身将其传递给堆栈中的后续视图,然后告诉导航控制器更改视图(例如例如点击一个单元格时)。

所以我花了一个星期才到这里,我可以创建我的模型,用数据填充它并在表格视图上显示它,但是当你想编辑数据时,我无法在模态视图上找到很多东西,具体如何设计模态视图(如果与普通视图有任何特定差异)?

另外,我不完全确定数据的整个“绑定”以查看对象它做什么以及如何以编程方式执行它?

非常感谢您的 cmets,提前提出建议。

【问题讨论】:

【参考方案1】:

当使用 presentModalViewController:animated 显示时,视图变为模态。您可以在呈现模态视图之前传递要编辑的模型。

DetailViewController dvc = ...;
dvc.model = model;
dvc.delegate = self; // if you want to use a delegate pattern.
[self presentModalViewController:dvc animated:YES];

由于您要编辑的模型在模态视图控制器中可用,您可以在 viewDidLoad 中设置值。 ios 平台上没有可用的数据绑定,这意味着您必须手动更新视图和模型。

- (void)viewDidLoad 
    [super viewDidLoad];
    self.someTextField.text = self.model.someText;

在使用模态视图时需要考虑的是,您必须提供一种关闭它的方法。例如。通过在顶部有一个带有取消和保存按钮的导航栏。使用以下方式关闭模态视图控制器:

[self dismissModalViewControllerAnimated:YES];

可以从模态视图控制器中关闭模态视图,但这也意味着这样的模态控制器必须能够保存相关模型。我会亲自使用对呈现控制器的回调,让它知道是保存还是取消,以及处理模态视图的关闭。这可以使用委托模式来完成。因此,当用户点击保存时,您可以更新模型,然后通知委托。

- (IBAction)save:(id)sender 
    self.model.someText = self.someTextField.text;
    [self.delegate detailViewControllerDidSave:self];

并且在演示者中有一个类似的方法:

-(void)detailViewControllerDidSave:(DetailViewController *)controller 
  // save the model
  [self dismissModalViewControllerAnimated:YES];

【讨论】:

嗨罗伯特,谢谢。那么 detailViewController 有什么特别之处,所以当它以模态方式显示时,字段变得可编辑? 不客气。我认为没有任何自动的方法可以做到这一点。 UIViewController 有一个编辑属性,可用于通过 setEditing:animated: 切换可编辑状态。如果您想使用相同的 DetailViewController 进行显示和编辑,您可以在调用 presentModalViewController:animated: 之后调用 [dvc setEditing:YES animated:NO]。然后你必须在 DetailViewController 中实现 setEditing:animated: 并更新适当的控件,比如 self.someTextField.enabled = edit. “iOS 上没有可用的数据绑定” - 不再正确:youtube.com/watch?v=88DkI8ZfEkg - 将在今年年底发布(某些操作系统许可证)【参考方案2】:

根据我对视图/数据的了解,提供了一些答案。我还没有使用 CoreData 的经验,所以不会回答那部分。

模态视图只是一个常规视图。但它的大小可能会有所不同,因为它涵盖了一些 UI 元素,这些元素不会被导航控制器中推送的视图覆盖。

对于视图的数据“绑定”,如果填充表格视图,则已经完成。在控制器中实现了一系列“数据源”方法,您可以在其中将数据从模型提供给视图(MVC 模式)。

【讨论】:

...所以绑定更像是一种 IB 工具,您可以在其中拥有一组数据,其中包含设置为查看对象的实体?编程等效项覆盖 - (UITableViewCell *)tableView:(UITableView *)tableView

以上是关于关于 iPhone 应用程序结构的问题 - 核心数据、视图、模态视图等的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 核心数据和多线程

[iPhone]你将如何为下面给出的结构设计核心数据对象模型

在 Core Data iPhone 应用程序的视图层次结构中保存位置

iPhone - 获取核心数据的数据

Iphone 编程 - 将现有的 sql 表导入到 sqlite 或核心数据

iPhone 应用程序:整体应用程序层次结构和架构