我正在构建一个类似于iPhone Notes应用程序的应用程序。
我的应用程序包含两个屏幕,第一个屏幕是列出所有记录的UITableView。当您单击其中一个记录或单击添加按钮时,将出现第二个屏幕。第二个视图包含一个UITextView,用户可以在其中添加/编辑该记录的文本。
两个屏幕都有一个View Controller。 MyListViewController将记录加载到UITableView中。当用户单击记录时,我将创建MyEditViewController的实例,并使用导航控制器的pushViewController
方法将其推送。
MyListViewController-> MyEditViewController
我的问题是哪个控制器应该处理CRUD逻辑,应该是父控制器(即MyListViewController)还是编辑控制器(即MyEditViewController)?
需要注意的一件事是,您应该可以通过滑动表格单元格并选择Delete从MyListController删除记录。
您还应该能够通过单击删除图标从MyEditViewController中删除。
我基本上是在尝试复制Notes应用程序,但是不确定CRUD逻辑应该放在哪里。
最佳答案
我最近开发了一个具有非常相似要求的应用程序。我认为您应该非常清楚自己的模型,视图和控制器。
模型是应用程序的非UI部分,在您的情况下是Notes的管理。我创建了一个单例对象,例如NotesManager,可以从代码中的任何位置访问其共享实例。类似于[NotesManager sharedInstance]
。在我的应用程序中,视图控制器不会读取/枚举文档目录的内容(因为那不是它的工作),NotesManager会。列表视图控制器向笔记管理器询问要显示的笔记。 [[NotesManager sharedInstance] notesFromDocsDir]
;
视图是应用程序的用户界面部分。在这种情况下,它将是表格视图和便笺的编辑视图。
控制器是充当视图和模型之间链接的控制器。如您所知,有ListViewController和EditViewController。
现在,有两种类型的交互:
第一个源于UI,必须更新模型。例如,用户点击删除或保存。在我的应用程序中,我执行类似[[NotesManager sharedInstance] deleteNote:Note]
的操作。您可以从两个View控制器执行此操作。
第二个源于模型端并更新您的UI。例如,在我的应用程序中,我启用了iTunesSharing
,因此用户可以通过iTunes添加/删除便笺。发生此类事件时,我的UI必须进行更新以反映documents目录的当前状态。为此,NotesManager调度NSNotification
。控制器注册这些通知并更新视图。
现在,对于您的原始问题,CRUD方法位于NotesManager中。当检测到某些更改时,可以由Controller或NotesManager本身调用它们。
HTH,
阿克沙伊