iPhone:哪个控制器应该处理CRUD逻辑?

时间:2011-08-11 15:54:29

标签: iphone objective-c ios model-view-controller crud

我正在构建一个类似iPhone Notes应用程序的应用程序。

我的应用程序包含两个屏幕,第一个屏幕是一个列出所有记录的UITableView。单击其中一个记录或单击添加按钮时,将显示第二个屏幕。第二个视图包含一个UITextView,用户可以在其中添加/编辑该记录的文本。

两个屏幕都有一个View Controller。 MyListViewController将记录加载到UITableView中。当用户点击记录时,我创建了一个MyEditViewController实例,并使用导航控制器的pushViewController方法推送它。

MyListViewController - > MyEditViewController

我的问题是哪个控制器应该处理CRUD逻辑,它应该是父控制器(即MyListViewController)还是编辑控制器(即MyEditViewController)?

需要注意的一点是,您应该能够通过滑动表格单元格并选择删除来从MyListController中删除记录。

您也可以通过单击删除图标从MyEditViewController中删除。

我基本上是在尝试复制Notes应用程序,但我不确定在CRUD逻辑应该去哪里的最佳做法。

4 个答案:

答案 0 :(得分:4)

在您描述的场景中,使用的最佳模式是委托模式。

只需为MyEditViewController创建一个委托,并让它委托你的MyListViewController。

您将委托定义为协议。所以在MyEditViewController.h放入此内容:

@class MyEditViewController;

@protocol MyEditViewControllerDelegate <NSObject>
@required
- (void)myEditViewController:(MyEditViewController *)controller didSaveNote:(BOOL)save;
@end

并将其添加到您现有的MyEditViewController.h代码中。

@interface MyEditViewController : UIViewController
....
@property (nonatomic, retain) id <MyEditViewControllerDelegate> delegate;
@end

在您的MyEditViewController.m代码中,当您按下保存或取消按钮时,您会发送以下消息:

[self.delegate myEditViewController:self didSaveNote:YES]

[self.delegate myEditViewController:self didSaveNote:YES]

取决于您按下保存或取消。

MyListViewController.h中,您采用了新创建的协议:

@interface MyListViewController : UIViewController <MyEditViewControllerDelegate>

在你的MyListViewController.m中,你记得两件事。首先实现所需的委托方法:

@implementation MyListViewController
...
- (void)myEditViewController:(MyEditViewController *)controller didSaveNote:(BOOL)save 
{
    // Do business logic here depending on the value of save
}

最后一件事是将MyListViewController设置为MyEditViewController的代表,如下所示:

MyEditViewController *myEditViewController = [[MyEditViewController alloc] initWithNibNamed:@"MyEditViewController" bundle:nil];
[myEditViewController setDelegate:self];

这样您就可以处理MyListViewController中的所有CRUD逻辑,这样您就可以相应地更新表视图。

答案 1 :(得分:1)

我最近开发了一个具有非常相似要求的应用程序。我认为你应该非常清楚你的模型,观点&amp;控制器。

模型是应用程序的非UI部分,在您的案例中是Notes的管理。我创建了一个单例对象,比如说NotesManager,可以从我的代码中的任何地方访问其共享实例。像[NotesManager sharedInstance]这样的东西。在我的应用程序中,视图控制器不会读取/枚举文档目录的内容(因为那不是它的工作),NotesManager会这样做。列表视图控制器向票据管理器询问要显示的注释。 [[NotesManager sharedInstance] notesFromDocsDir];

视图是应用程序的UI部分。在这种情况下,它将是表视图和&amp;笔记的编辑视图。

控制器是充当视图和视图之间链接的控制器。模型。如您所知,有ListViewController&amp; EditViewController。

现在,有两种类型的互动:

第一个来自UI&amp;必须更新模型。例如,用户点击删除或保存。在我的应用程序中,我执行[[NotesManager sharedInstance] deleteNote:Note]之类的操作。您可以从两个View控制器执行此操作。

第二个来自Model end&amp;更新您的UI。例如,在我的应用程序中,我启用了iTunesSharing&amp;因此,用户可以通过iTunes添加/删除笔记。发生此类事件时,我的UI必须更新自身以反映文档目录的当前状态。为此,NotesManager将调度NSNotification。控制器注册这些通知&amp;更新视图。

现在,对于您的原始问题,CRUD方法驻留在NotesManager中。当控制器检测到某些内容发生变化时,它们可以被控制器或NotesManager本身调用。

HTH,

阿克沙伊

答案 2 :(得分:0)

两者。而且都没有。

您应该使用模型来存储/提供数据。

ViewController应控制视图并将指令传递给模型以保存更改等。

我会在模型中执行业务逻辑 - 只需从viewcontrollers中调用模型中的方法。

看到您的子视图控制器正在进行编辑,它应该是指示该实例中的模型的视图。

在处理数据删除时,父视图控制器应该指示模型。

答案 3 :(得分:0)

我想说一个好的解决方案是在你的模型中实现所有这些操作。比如,你有一个名为Note的类可以处理CRUD操作。您还需要NoteCollection之类的内容,以便为您的表格视图提供有效数据。

MyEditViewController将始终处理应该处理保存和删除等操作的单个注释。这些应该在你的笔记集中更新它的状态。

相关问题