iPhone: Какой контроллер должен обрабатывать логику CRUD? - PullRequest
0 голосов
/ 11 августа 2011

Я создаю приложение, похожее на приложение iPhone Notes.

Мое приложение состоит из двух экранов, первый экран представляет собой UITableView, в котором перечислены все записи.Второй экран появляется, когда вы нажимаете на одну из записей или нажимаете кнопку добавления.Это второе представление содержит UITextView, в котором пользователь может добавлять / редактировать текст для этой записи.

На обоих экранах имеется View Controller.MyListViewController загружает записи в UITableView.Когда пользователь нажимает на запись, я создаю экземпляр MyEditViewController и нажимаю на него, используя метод pushViewController контроллера навигации.

MyListViewController -> MyEditViewController

Мой вопрос заключается в том, какой контроллер долженобрабатывать логику CRUD, должен ли это быть родительский контроллер (например, MyListViewController) или контроллер редактирования (например, MyEditViewController)?

Следует отметить, что вы должны иметь возможность удалить запись из MyListController, проводя по таблицеячейка и выбрав удалить.

Вы также можете иметь возможность удалить из MyEditViewController, щелкнув значок удаления.

Я в основном пытаюсь продублировать приложение Notes, но не уверен, что является наилучшей практикой с точки зрениякуда должна идти логика CRUD.

Ответы [ 4 ]

4 голосов
/ 11 августа 2011

В описываемом вами сценарии лучшим шаблоном будет шаблон делегата.

Просто создайте делегат для вашего 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];

Таким образом вы обрабатываете всю логику CRUD в вашем MyListViewController и таким образом можете соответствующим образом обновлять представление таблицы.

1 голос
/ 11 августа 2011

Недавно я разработал приложение, которое имеет очень похожие требования. Я думаю, вы должны быть очень четкими в отношении вашей модели, представлений и контроллеров

Модель - это не часть пользовательского интерфейса вашего приложения, а управление Notes в вашем случае. Я создал одноэлементный объект, скажем NotesManager, к общему экземпляру которого можно получить доступ из любой точки моего кода. Что-то вроде [NotesManager sharedInstance]. В моем приложении контроллер представления не читает / не перечисляет содержимое каталога документов (потому что это не его работа), это делает NotesManager. Контроллер представления списка запрашивает у менеджера заметок заметки для отображения. [[NotesManager sharedInstance] notesFromDocsDir];

Представления являются частью пользовательского интерфейса вашего приложения. В этом случае это будет представление таблицы и представление редактирования заметки.

Контроллеры являются связующим звеном между вашими представлениями и моделью. Как вы знаете, есть ListViewController и EditViewController.

Теперь есть два типа взаимодействий:

Первый происходит из пользовательского интерфейса и должен обновлять модель. Например, пользователь нажимает удалить или сохранить. В моем приложении я делаю что-то вроде [[NotesManager sharedInstance] deleteNote:Note]. Вы можете сделать это с обоих контроллеров View.

Второй происходит с конца модели и обновляет ваш пользовательский интерфейс. Например, в моем приложении я включил iTunesSharing и, следовательно, пользователь может добавлять / удалять заметки через iTunes. Когда такое событие происходит, мой пользовательский интерфейс должен обновить себя, чтобы отразить текущее состояние каталога документов. Для этого NotesManager отправляет NSNotification. Контроллер (ы) регистрирует эти уведомления и обновляет представление.

Теперь для вашего исходного вопроса методы CRUD находятся в NotesManager. Они могут вызываться контроллерами или самим NotesManager, когда он обнаруживает, что что-то изменилось.

НТН,

Акшай

0 голосов
/ 11 августа 2011

Я бы сказал, что хорошим решением является реализация всех этих операций в вашей модели. Скажем, у вас есть класс с именем Note, который может обрабатывать операции CRUD. Вам также понадобится что-то вроде NoteCollection, которое предоставит действительные данные для вашего табличного представления.

MyEditViewController всегда будет иметь дело с одной заметкой, которая должна обрабатывать такие операции, как сохранение и удаление. Это должно обновить его состояние в вашей коллекции заметок.

0 голосов
/ 11 августа 2011

Оба. И ни того, ни другого.

Вы должны использовать модель для хранения / предоставления данных.

ViewController должен управлять представлениями и передавать инструкции модели для сохранения изменений и т. Д.

Я бы делал бизнес-логику в модели - просто вызывал методы в модели из контроллеров представления.

Видя, как ваш дочерний viewcontroller выполняет редактирование, это должно быть то, что инструктирует модель в этом случае.

Родительский view-контроллер должен проинструктировать модель, когда вы обрабатываете удаление данных.

...