5

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

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

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

视图控制器

  • 所以 UINavigationControllers 通常没有子类,而是作为 AppDelegate 中的属性创建的,并且是 MainWindow.xib 的主要“子视图”。

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

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

核心数据

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

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

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

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

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

4

2 回答 2

2

当使用 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];
}
于 2010-11-03T21:22:48.997 回答
0

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

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

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

于 2010-11-03T15:39:09.267 回答