我正在尝试决定一种设计模式。我有一个应用程序,用户将一个条目添加到Core Data数据库。他们也应该能够在以后编辑该条目。两个视图基本上都显示相同的数据,只有一个用于编辑已添加的内容。
我不确定我是否应该有两个非常相似的单独视图控制器,或者我是否应该使用某种继承来设置它,或者是否有其他想法我没有想到。
感谢您的意见。
答案 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
此视图控制器的唯一用途是创建用于编辑和保存模型对象数据的演示文稿。
答案 1 :(得分:2)
我处于相同的情况,我使用一个视图控制器。如果我传递一个实体,它将编辑该实体。如果我不这样做,那就是新实体。在viewDidLoad中,我检查是否设置了实体,如果没有,我创建一个实体。然后我继续填写文本字段和其他信息。如果它是一个新实体,则属性将为空或具有默认值,视图控制器中的视图也将如此。当用户准备好时,我不必检查是否要更新或插入,因为实体已经在开头插入。
答案 2 :(得分: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