我正在开发一个简单的核心数据应用程序,它可以保存列表的名称。我使用带文本字段的UIAlertView输入数据。我的问题是,当用户输入数据并点击保存时,它不会显示在TableView中。但是当我在那里重新运行它时,它就被创建了。它在TableView中。
所以在这一点上,我很遗憾,我对核心数据非常陌生,所以如果你有任何建议,我会全神贯注。谢谢!
以下是我的TableView.m中的所有核心数据代码:
@implementation ViewController
- (NSManagedObjectContext *)managedObjectContext {
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Fetch the devices from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"List"];
self.lists = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
[self.tableView reloadData];
}
和
-(IBAction)add:(id)sender {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Add List" message:@"Create a New Wish List" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Save", nil];
[alert setAlertViewStyle:UIAlertViewStylePlainTextInput];
[alert setTag:2];
[alert show];
alert.delegate = self;
}
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 0 && alertView.tag == 2) {
UITextField *tf = [alertView textFieldAtIndex:0];
NSManagedObjectContext *context = [self managedObjectContext];
// Create a new managed object
NSManagedObject *newList = [NSEntityDescription insertNewObjectForEntityForName:@"List" inManagedObjectContext:context];
[newList setValue:tf.text forKey:@"name"];
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObjectContext *context = [self managedObjectContext];
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete object from database
[context deleteObject:[self.lists objectAtIndex:indexPath.row]];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
return;
}
// Remove device from table view
[self.lists removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
@end
如果您还需要其他信息,请告诉我们!谢谢!
答案 0 :(得分:1)
您似乎将表数据存储在名为self.lists
的数组中。这意味着,要使您的表显示数据,您需要更新该数组的内容。在创建新条目后,您似乎不会这样做,因为您的提醒视图回调不会更新self.lists
的内容。
您似乎没有排序self.lists
(至少,您的获取请求中没有排序描述符),因此您可以直接将新条目添加到数组中。它是一个可变数组,所以只需添加新对象即可。然后告诉表视图您添加了一个新行(类似于您在删除条目时当前删除行的方式)。
如果您决定在某个时刻开始对表格进行排序,那么最好从持久性商店更新self.lists
。基本上,从viewDidLoad
获取代码,从核心数据中获取数据,并在添加(或删除)条目时重复这些步骤。
您可能希望使用NSFetchedResultsController
,它旨在简化核心数据与表格视图的组合。