2011-08-11 5 views
0

아이폰 노트 앱과 유사한 앱을 만들고 있습니다.iPhone : 어떤 컨트롤러가 CRUD 로직을 처리해야합니까?

내 앱은 두 개의 화면으로 구성되며, 첫 번째 화면은 모든 레코드를 나열하는 UITableView입니다. 두 번째 화면은 레코드 중 하나를 클릭하거나 추가 버튼을 클릭 할 때 나타납니다. 이 두 번째보기에는 사용자가 해당 레코드의 텍스트를 추가/편집 할 수있는 UITextView가 포함되어 있습니다.

두 화면 모두보기 컨트롤러가 있습니다. MyListViewController는 UITableView에 레코드를로드합니다. 사용자가 레코드를 클릭하면 MyEditViewController의 인스턴스를 만들고 내비게이션 컨트롤러의 pushViewController 메서드를 사용하여 푸시합니다.

MyListViewController -> MyEditViewController

내 질문이있는 컨트롤러가 CRUD 로직을 처리해야, 그것은 부모 컨트롤러 (즉 MyListViewController) 또는 편집 컨트롤러 (즉 MyEditViewController)해야 하는가?

주목할 점은 표 셀을 스 와이프하고 삭제를 선택하여 MyListController에서 레코드를 삭제할 수 있어야한다는 것입니다.

또한 삭제 아이콘을 클릭하여 MyEditViewController에서 삭제할 수 있어야합니다.

기본적으로 Notes 응용 프로그램을 복제하려고하지만 CRUD 논리가 어떤 위치에 있어야하는지 모르기 때문에 모범 사례입니다.

답변

1

최근에 비슷한 요구 사항이있는 응용 프로그램을 개발했습니다. 나는 당신이 당신의 모델에 대해 매우 분명해야한다고 생각한다.보기는 &이다.

모델은 애플리케이션의 UI가 아닌 부분으로, 귀하의 경우에는 Notes를 관리합니다. NotesManager와 같은 싱글 톤 객체를 만들었습니다. 공유 객체는 코드의 아무 곳에서나 액세스 할 수 있습니다. [NotesManager sharedInstance]과 같은 것입니다. 내 응용 프로그램에서는보기 컨트롤러가 문서 디렉토리의 내용을 읽거나 열거하지 않습니다 (NotesManager가 해당 작업을 수행하지 않기 때문에). 목록보기 컨트롤러는 메모 관리자에게 메모를 표시 할 것인지 묻습니다. [[NotesManager sharedInstance] notesFromDocsDir];

뷰는 응용 프로그램의 UI 부분입니다. 이 경우 메모보기의 표보기 &이됩니다.

컨트롤러는 귀하의보기 & 모델 사이의 링크 역할을하는 컨트롤러입니다. 아시다시피, ListViewController & EditViewController가 있습니다. 첫 번째는 UI &에서 유래

이 모델을 업데이트 할 수 있습니다

지금, 상호 작용의 두 가지 유형이 있습니다. 예를 들어, 사용자는 삭제 또는 저장을 가볍게 누르십시오. 내 응용 프로그램에서 나는 [[NotesManager sharedInstance] deleteNote:Note] 같은 것을한다. View 컨트롤러에서이 작업을 수행 할 수 있습니다.

두 번째 모델은 모델 업데이트 &에서 업데이트되었습니다. 예를 들어, 내 응용 프로그램에서 iTunesSharing &을 사용할 수 있으므로 사용자는 iTunes를 통해 메모를 추가/삭제할 수 있습니다. 이러한 이벤트가 발생하면 내 UI는 문서 디렉토리의 현재 상태를 반영하여 자체를 업데이트해야합니다. 이를 위해 NotesManager는 NSNotification을 전달합니다.컨트롤러는 이러한 알림을 등록하고 &보기를 업데이트합니다.

원래 질문에 대한 CRUD 메소드는 NotesManager에 있습니다. Controller 나 NotesManager 자체에서 호출 할 수 있습니다.

HTH,

하기 Akshay는

+0

똑똑한 대답은 내가 찾고 있던 바로 그 대답이다. 나는 이미이 결론에 도달했지만 확신이 없으므로 백업을 했으므로이 길로 내려갈 것입니다. – Camsoft

+0

다행이었습니다. – Akshay

0

둘 다. 그리고 둘 다.

데이터를 저장/제공하려면 모델을 사용해야합니다.

의 ViewController의 견해를 제어하고 내가 모델의 비즈니스 로직을 할 것 등을 변경

을 저장 모델에 명령을 전달해야합니다은 - 단순히 viewcontrollers에서 모델의 메소드를 호출합니다.

자녀가 viewcontroller에서 편집을하고있는 것을 보는 것은 해당 인스턴스에서 모델을 지시하는 것입니다.

상위 뷰 컨트롤러는 데이터 삭제를 처리 할 때 모델에 지시해야합니다.

0

좋은 해결책은 이러한 모든 작업을 모델에 구현하는 것이라고 말하고 싶습니다. CRUD 작업을 처리 할 수있는 Note 클래스가 있습니다. 테이블보기에 유효한 데이터를 제공하는 NoteCollection과 같은 것이 필요할 것입니다.

MyEditViewController는 저장 및 삭제와 같은 작업을 처리해야하는 단일 메모를 항상 처리합니다. 메모 컬렉션에서 상태를 업데이트해야합니다.

+0

내 응용 프로그램은 사용자 문서 디렉토리에있는 파일을 만들 수 있습니다. 현재 MyListViewController는 디렉토리의 파일을 읽고 Note 객체의 배열을 만들고, 각 메모 객체는 기본적으로 제목과 파일 이름입니다. 메모 개체가 내 모델이라고 가정합니다. 어디에서 작성, 삭제, 갱신 메소드를 넣어야합니까? – Camsoft

4

설명하는 시나리오에서 사용할 최상의 패턴은 위임 패턴입니다.

MyEditViewController에 대한 대리인을 만들고 MyListViewController를 위임하게하면됩니다.

대리인을 프로토콜로 정의합니다.

@class MyEditViewController; 

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

을하고 기존 MyEditViewController.h 코드에 이것을 추가 : 그래서 MyEditViewController.h이에 넣어. 저장하거나 취소 밀어

[self.delegate myEditViewController:self didSaveNote:YES] 

또는

[self.delegate myEditViewController:self didSaveNote:YES] 

당신에 따라 : 당신의 MyEditViewController.m 코드에서

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

당신은 다음과 같은 메시지를 보낼 저장하거나 취소 버튼을 극복 누르면. 에서

당신의 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 
} 

하고 당신이처럼 MyEditViewController의 위임에 MyListViewController :

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

에 모든 CRUD 로직을 처리하는 그런 식으로 당신의 MyListViewController 및 그런 식으로 그에 따라 테이블 뷰를 업데이트 할 수 있습니다.

+0

매우 좋은 답변입니다. +1. –

+0

훌륭한 답변이지만 모델 작성을 권장하는 다른 답변에 대해 어떻게 생각합니까? – Camsoft

+0

당신이 어떤 종류의 비즈니스 로직을 구현했는지 언급 한 적이 없으므로 결정을 내릴 때까지 남겨 두었습니다. Cocoa는 MVC 프레임 워크에서 항상 모델을 사용하는 것이 좋지만, 데이터를 저장하는 방법에 따라 모델을 사용하는 것이 좋습니다. –

관련 문제