gpt4 book ai didi

ios - 核心数据仅在我重新启动应用程序时获取

转载 作者:行者123 更新时间:2023-11-29 03:04:56 24 4
gpt4 key购买 nike

我正在开发一个简单的核心数据应用程序,它保存列表的名称。我正在使用带有文本字段的 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

如果您还需要什么,请告诉我!谢谢!

最佳答案

看起来您正在将表格数据存储在名为 self.lists 的数组中。这意味着,要让您的表格显示数据,您需要更新该数组的内容。看起来您在创建新条目后并没有这样做,因为您的警报 View 回调不会更新 self.lists 的内容。

您似乎没有对 self.lists 进行排序(至少,您的获取请求中没有排序描述符),因此您可以直接将新条目添加到数组中。这是一个可变数组,因此只需添加新对象即可。然后告诉 TableView 您添加了一个新行(类似于您当前在删除条目时删除行的方式)。

如果您决定在某个时候开始对表格进行排序,最好从持久存储中更新 self.lists。基本上,从从 Core Data 获取数据的 viewDidLoad 获取代码,并在添加(或删除)条目时重复这些步骤。

您可能想看看使用 NSFetchedResultsController,它旨在简化核心数据与 TableView 的组合。

关于ios - 核心数据仅在我重新启动应用程序时获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com