我有一个简单的Grocery List应用程序,我在其中添加项目到列表中。我想使用Core Data保存这些项目,以便在应用程序终止时保存数据。
我只想显示所有数据,所以如果我理解正确,我不需要为此实现NS-FetchedResultsController。
现在,项目已成功添加到我的CoreData中,但只有当我退出应用程序并重新打开它时,列表才会刷新。
到目前为止,我已经尝试将[self.tableView reloadData]
,[[self tableView] reloadData]
和[self.tableView reloadRowsAtIndexPaths:groceryArray withRowAnimation:YES];
放在我能想到的所有位置,包括viewDidLoad方法,unwindToSegue方法,'来自Add Grocery Item List视图控制器,并且还实现了viewWillAppear方法。
我的mainAppDelegate代码直接来自Apple和一个教程...所以我不认为这个代码是问题所在。正确导入所有属性和文件。
我的数据实体名为" Item"我有一个标题为" toDoItems" (type:string)。
我的TableViewController代码显示数据列表(并且没有刷新):
@interface XYZToDoListViewController ()
@end
@implementation XYZToDoListViewController
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize groceryArray;
- (IBAction)unwindToList:(UIStoryboardSegue *)segue
{
[[self tableView] reloadData];
}
- (void)viewDidLoad
{
[super viewDidLoad];
mainAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
_managedObjectContext = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *items = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:_managedObjectContext];
[request setEntity:items];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[_managedObjectContext executeFetchRequest:request error:&error]mutableCopy]; if (mutableFetchResults == nil){
//handle error
}
[self setGroceryArray:mutableFetchResults];
[[self tableView] reloadData];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSManagedObject *eventToDelete = [ groceryArray objectAtIndex:indexPath.row];
[_managedObjectContext deleteObject: eventToDelete];
[groceryArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
NSError *error = nil;
if (![_managedObjectContext save:&error])
{ //handle error
}
}
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section
{
return [groceryArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"ListPrototypeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
Item *items = (Item *) [groceryArray objectAtIndex:indexPath.row];
cell.textLabel.text = [items toDoItems];
return cell;
}
@end
我的添加新项目视图控制器:
@interface XYZAddItemViewController ()
@property (strong, nonatomic) IBOutlet UIBarButtonItem *doneButton;
@end
@implementation XYZAddItemViewController
@synthesize textField;
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
Item *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:_managedObjectContext];
[item setToDoItems:textField.text];
NSLog (@"Item Added");
NSError *error = nil;
if (![_managedObjectContext save:&error])
{ //handle error }
textField.text = NULL;
}
}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)segue sender:(id)sender {
if (self.textField.text.length > 0)
{
return YES;
}
else {
return NO;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
mainAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
_managedObjectContext = [appDelegate managedObjectContext];
self.navigationController.view.backgroundColor =
[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg_white.png"]];
self.view.backgroundColor = [UIColor clearColor];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
@end
我需要更改什么才能让表视图控制器刷新?
答案 0 :(得分:0)
添加项目后,您必须再次执行获取请求,并进行分配
在调用groceryArray
之前,数据源数组reloadData
的结果。
否则reloadData
只会再次显示相同的旧数据。
(这是获取结果控制器为您管理的内容。)
答案 1 :(得分:0)
UITableView的数据来自groceryArray。
您正在将对象正确插入到CoreData中,但您的tableView仍然在查看您在开始时获取的groceryArray。
因此,当您添加内容时,需要再次运行获取请求,将其保存到groceryArray,然后执行reloadData。这样它应该反映出变化。