4

I am trying to decide on a design pattern. I have an app where the user adds an entry to a Core Data database. They also should have the ability to edit that entry at a later time as well. Both views basically show the same data, only one is for editing what has already been added.

I am not sure if I should have two very similar separate view controllers or if I should use some kind of inheritance to set this up, or if there is some other idea that I'm not thinking of.

I appreciate your input.

4

3 に答える 3

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

このビュー コントローラーの唯一の目的は、モデル オブジェクト データを編集および保存するためのプレゼンテーションを作成することです。

于 2012-08-12T00:51:35.983 に答える
2

私は同じ状況にあり、両方に1つのView Controllerを使用しています。エンティティを渡すと、そのエンティティが編集されます。そうしないと、それは新しいエンティティになります。viewDidLoad では、エンティティが設定されているかどうかを確認し、設定されていない場合は作成します。次に、テキストフィールドやその他の情報を入力します。それが新しいエンティティの場合、属性は空になるか、デフォルト値が設定され、View Controller のビューも同様になります。ユーザーの準備ができたら、更新するか挿入するかを確認する必要はありません。最初にエンティティが既に挿入されているためです。

于 2012-08-12T00:13:27.733 に答える
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

PASSWORDControllerは、既存のオブジェクトの編集と表示に使用する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
于 2012-08-11T23:41:30.100 に答える