出现视图时,在表格中加载新数据

时间:2013-08-01 03:26:29

标签: ios objective-c cocoa-touch

在我的项目中,我有一种添加/显示/编辑联系人的机制,与地址簿应用程序类似。我使用核心数据进行数据管理。基本上,当应用程序加载时,我所有当前的联系人都在那里,但是当我添加一个新的联系人并返回所有联系人的表视图时,我看不到更改。然后,当我关闭应用程序并再次打开它时,更改是可见的。有人可以让我知道我做错了什么吗?我希望在添加新联系人后刷新它。

allathletes.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc]
                                  initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAthlete)];
    self.navigationItem.rightBarButtonItem = addButton;

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    _managedObjectContext = [appDelegate managedObjectContext];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *athlete = [NSEntityDescription entityForName:@"Athlete" inManagedObjectContext:_managedObjectContext];
    [request setEntity:athlete];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"first" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[_managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil){
        //handle error
    }
    [self setAthleteArray:mutableFetchResults];


    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}


-(void)addAthlete{
    AthleteAdd *addAthlete= [self.storyboard instantiateViewControllerWithIdentifier:@"addAthlete"];
    [self.navigationController pushViewController:addAthlete animated:YES];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Athlete Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    Athlete *athlete = (Athlete *)[athleteArray objectAtIndex:indexPath.row];
    cell.textLabel.text = [athlete first];
    cell.detailTextLabel.text = [athlete last];
    // Configure the cell...

    return cell;
}

addathlete.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
    _managedObjectContext = [appDelegate managedObjectContext];

    UIBarButtonItem *saveButton=[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(saveAthlete)];
    UIBarButtonItem *cancelButton=[[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleDone target:self action:@selector(cancelSave)];
    self.navigationItem.rightBarButtonItem = saveButton;
    self.navigationItem.leftBarButtonItem = cancelButton;
}

-(void)saveAthlete{
    Athlete *athlete = [NSEntityDescription insertNewObjectForEntityForName:@"Athlete" inManagedObjectContext:_managedObjectContext];
    [athlete setFirst:firstTextField.text];
    [athlete setLast:lastTextField.text];

    NSError *error = nil;
    if(![_managedObjectContext save:&error]){
        //handle dat error
    }
    [[self navigationController] popViewControllerAnimated:YES];
}

-(void)cancelSave{

    [[self navigationController] popViewControllerAnimated:YES];

}

2 个答案:

答案 0 :(得分:1)

新的运动员被添加到持久性存储中,但是您的表没有向您显示更新的数据。添加新的Athlete对象后,从持久性存储中获取更新的数据到AthleteArray(步骤1)并重新加载表视图(步骤2)。

第1步:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    _managedObjectContext = [appDelegate managedObjectContext];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *athlete = [NSEntityDescription entityForName:@"Athlete" inManagedObjectContext:_managedObjectContext];
    [request setEntity:athlete];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"first" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[_managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil){
        //handle error
    }
    [self setAthleteArray:mutableFetchResults];

第2步:

[self.tableView reloadData];

答案 1 :(得分:1)

重新加载 tabelViewviewDidAppear:方法中的viewWillAppear:。在viewDidLoad:pop时,dismiss方法不会调用。这就是为什么更新在tableView中不可见。