2012-08-11 7 views
4

디자인 패턴을 결정하려고합니다. 사용자가 핵심 데이터베이스에 항목을 추가하는 앱이 있습니다. 또한 나중에 해당 항목을 편집 할 수 있어야합니다. 두보기 모두 기본적으로 동일한 데이터를 표시하며 하나만 이미 추가 된 것을 편집하기위한 것입니다.ViewController 대 ViewController 편집

두 개의 매우 다른 분리 된보기 컨트롤러가 있어야하는지, 또는 이것을 설정하기 위해 상속을 사용해야하는 경우 또는 내가 생각하지 않은 다른 아이디어가 있는지 확실하지 않습니다.

귀하의 의견에 감사드립니다.

+1

나는 nib 파일을 공유하고 두 개의 별도의 'UIViewController' 하위 클래스를 만들 것입니다. – mAu

+0

나는 둘 다 편집 작업으로 취급하고있다. 하나의 경우에는 편집되는 정보가 기본값 인 빈번한 빈 문자열 일뿐입니다. –

답변

3

비슷한 문제가 발생하여 두 작업을 모두 수행하기 위해 동일한 UIViewController을 사용하게되었습니다. 두 유스 케이스는 근본적으로 동일합니다. 사용자가 정보를 입력 한 다음 저장합니다. 데이터의 유효성 검사는 동일하며 저장은 동일하며 프레젠테이션은 동일합니다. 모델 객체가 이미 존재하는지 여부 만 달라집니다. 다음의 예를 생각해

.H 파일 :

@interface WHItemViewController : UITableViewController 

// This is the only attribute we really need to expose in our header 
// so that the presenting view controller can set the model object when editing 
@property (nontatomic, retain) WHItem* item; 

@end 

하는 .m 파일 :

@interface WHItemViewController() 

// Other 'private' properties and methods 

- (void)didSelectSaveButton:(id)sender; 

@end 

@implementation WHItemViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if (self.item) { // setup the UI with the model object, if present. 
     self.fooText.text = self.item.foo; 
     self.barText.text = self.item.bar; 
     self.bazText.text = self.item.baz; 
    } 
} 

- (void)didSelectSaveButton:(id)sender { 
    if (!self.item) { 
     WHItem* item = nil; 

     // create a new instance from your managed object context 
     // and set it to the item property 

     self.item = item; 
    } 

    self.item.foo = self.fooText.text; 
    self.item.bar = self.barText.text; 
    self.item.baz = self.bazText.text 

    NSError* error = nil; 
    [WHDataAccess sharedInstance].managedObjectContext save:&error]; 

    // Error handling, etc. 
} 

// Other methods 

@end 

이보기 컨트롤러의 유일한 목적은 편집을위한 프리젠 테이션 및 저장 모델 객체 데이터를 생성하는 것입니다.

+0

대단히 고마워! 나는이 디자인이 마음에 든다. – Jamie

0

나는이 같은 패턴을 사용 :

#import "ItemViewController.h" 

@protocol AddItemViewControllerDelegate; 

@interface AddItemViewController : ItemViewController 
{ 
    id <AddItemViewControllerDelegate> delegate; 
} 
@property (nonatomic, assign) id <AddItemViewControllerDelegate> delegate; 

-(IBAction)cancel:(id)sender; 
-(IBAction)save:(id)sender; 
@end 

@protocol AddItemViewControllerDelegate 
    - (void)addItemViewController:(AddItemViewController *)controller didFinishWithSave: (BOOL)save; 
@end 

AddItemController은 단순히 내가 편집 및 기존 개체를 표시하기 위해 사용하는 ItemViewController을 하위 클래스.

그런 다음 구현에 나는이 같은 수행 내가 같은 상황에있어

#import "AddItemViewController.h" 

@implementation AddItemViewController 
@synthesize delegate; 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    ... 
    // Set up the undo manager and set editing state to YES. 
    [self setUpUndoManager]; 
    self.editing = YES; 
} 

-(void)viewDidUnload 
{ 
    [self cleanUpUndoManager]; 
    [super viewDidUnload]; 
} 

-(IBAction)cancel:(id)sender 
{ 
    [delegate addItemViewController:self didFinishWithSave:NO]; 
} 

-(IBAction)save:(id)sender 
{ 
    [delegate addItemViewController:self didFinishWithSave:YES]; 
} 

// ... other stuff. 

@end 
2

을, 나는 모두를위한 하나의 뷰 컨트롤러를 사용합니다. 엔티티를 전달하면 엔티티가 편집됩니다. 내가하지 않으면 그것은 새로운 실체입니다. viewDidLoad에서 엔티티가 설정되어 있는지 확인하고 그렇지 않은 경우 엔 엔티티를 만듭니다. 그런 다음 텍스트 필드와 기타 정보를 채 웁니다. 새로운 엔티티 인 경우 속성은 비어 있거나 기본값을 가지므로 내 View Controller의보기도 마찬가지입니다. 사용자가 준비되면 엔티티가 처음에 삽입되었으므로 업데이트 또는 삽입 여부를 확인할 필요가 없습니다.

+0

대단히 감사합니다. 나는이 디자인 방법으로 갈 것입니다. – Jamie