我正在开发我的第一个应用程序,需要一些帮助。我已经阅读了大量关于 SO 的类似问题,但没有得到任何结果。
我有一个简单的表格视图控制器,它有一个加号按钮;按下时,会导致模态视图控制器要求用户将信息插入到 4 个单独的字段中。当用户点击保存时,模式视图消失,信息显示在表格视图中,因为保存按钮调用 NSManagedObject 子类并通过核心数据保存它。
我正在尝试使用它,以便当用户输入第一个字段(名称)时,如果他们之前已经输入过该名称(如果他们使用 save 方法将其添加到 Core Data),它会自动填充并显示具有与该名称匹配的条目的隐藏表视图。我第一次开始使用 NSMutableArray,但由于 Jeff 的评论,它不会持久地保留数据,所以因为我已经拥有 Core Data 功能,所以使用它更有意义。我正在编辑这篇文章以包括我的核心数据当前是如何设置的。
我基本上想实现这一点,但使用核心数据(http://www.dalmob.org/2011/03/01/alternative-autocomplete-uitextfield/)
有一个与人员实体有关系的信息实体。
- (IBAction)save:(id)sender
{
NSManagedObjectContext *context = [self managedObjectContext];
Information *information = [NSEntityDescription insertNewObjectForEntityForName:@"Information" inManagedObjectContext:context];
People *enteredPerson = (People *)[People personWithName:self.nameTextField.text inManagedObjectContext:context];
information.whichPerson = enteredPerson;
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Can't save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
enterPerson 调用 People NSManagedObjectSubclass 中的 personWithName 方法:
+ (People *)personWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *)context
{
People *people = nil;
// Creating a fetch request to check whether the name of the person already exists
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"People"];
request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *fetchedPeople = [context executeFetchRequest:request error:&error];
if (!fetchedPeople)
{
// Handle Error
}
else if (![fetchedPeople count])
{
// If the person count is 0 then let's create it
people = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:context];
people.name = name;
}
else
{
// If the object exists, just return the last object .
people = [fetchedPeople lastObject];
}
return people;
}
根据创建 NSFetchRequest 的建议,我想知道执行此操作的最佳技术。
我是否在最后添加条目的 Save 方法中执行此操作,如下所示:
// NSFetchRequest
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
// Specifiy a predicate here if there are certain conditions your fetch must adhere to
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY name CONTAINS[c] %@", self.nameTextField.text];
[fetchRequest setPredicate:predicate];
//NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle error
}
if ([fetchedObjects count] == 0)
{
// Add entry to results
}
我想要实现的是,从核心数据中,当用户输入名称时,引用核心数据(带有获取请求),如果该名称存在,当用户开始输入时,填充位于文本字段下方的表视图.
任何指导将不胜感激。
编辑:我已经用一些进一步的代码更新了一个答案,几乎可以让它工作。
编辑:更多代码:
.h 中的属性声明
@property (retain, nonatomic) IBOutlet UITextField *nameTextField;
@property (nonatomic, retain) NSString *substring;
@property (weak, nonatomic) IBOutlet UITableView *testTableView;
@property (nonatomic, retain) NSFetchedResultsController* autocompleteFetchedResultsController;
- (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring;
ViewDidLoad
- (void)viewDidLoad
{
NSError *error;
if (![[self autocompleteFetchedResultsController] performFetch:&error])
{
NSLog(@"Unresolved error %@ %@", error, [error userInfo]);
exit(-1);
}
self.testTableView.delegate = self;
self.testTableView.dataSource = self;
self.testTableView.hidden = YES;
self.testTableView.scrollEnabled = YES;
self.nameTextField.delegate = self;
[super viewDidLoad];
}
保存方法
- (IBAction)save:(id)sender
{
NSManagedObjectContext *context = [self managedObjectContext];
Transaction *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
People *enteredPerson = (People *)[People personWithName:self.nameTextField.text inManagedObjectContext:context];
transaction.whoFrom = enteredPerson;
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Can't save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
谢谢,