iOS核心数据阵列仅在我启动应用程序时显示

时间:2014-04-23 22:37:25

标签: ios objective-c uitableview core-data

我有一个简单的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

我需要更改什么才能让表视图控制器刷新?

2 个答案:

答案 0 :(得分:0)

添加项目后,您必须再次执行获取请求,并进行分配 在调用groceryArray之前,数据源数组reloadData的结果。

否则reloadData只会再次显示相同的旧数据。

(这是获取结果控制器为您管理的内容。)

答案 1 :(得分:0)

UITableView的数据来自groceryArray。

您正在将对象正确插入到CoreData中,但您的tableView仍然在查看您在开始时获取的groceryArray。

因此,当您添加内容时,需要再次运行获取请求,将其保存到groceryArray,然后执行reloadData。这样它应该反映出变化。