细节视图控制器如何将所做的更改告知主控制器?

How the detail view controller told the main controller about the changes made?

我正在阅读 Big Nerd Ranch 一书,我正在阅读有关导航控制器的第 10 章。

在主控制器中,有一个 TableView ( https://github.com/bignerdranch/iOS3eSolutions/blob/master/11.%20Homepwner/Homepwner/Homepwner/ItemsViewController.m ),其中有两个与详细视图交互的方法:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[self tableView] reloadData];
}

- (void)tableView:(UITableView *)aTableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detailViewController = [[DetailViewController alloc] init];

    NSArray *items = [[BNRItemStore sharedStore] allItems];
    BNRItem *selectedItem = [items objectAtIndex:[indexPath row]];

    // Give detail view controller a pointer to the item object in row
    [detailViewController setItem:selectedItem];

    // Push it onto the top of the navigation controller's stack
    [[self navigationController] pushViewController:detailViewController
                                           animated:YES];
}

在详细视图控制器(https://github.com/bignerdranch/iOS3eSolutions/blob/master/11.%20Homepwner/Homepwner/Homepwner/DetailViewController.m)中,有一种方法可以更改"saves" BNRItem :

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    // Clear first responder
    [[self view] endEditing:YES];

    // "Save" changes to item
    [item setItemName:[nameField text]];
    [item setSerialNumber:[serialNumberField text]];
    [item setValueInDollars:[[valueField text] intValue]];
}

代码运行良好: 我了解主控制器如何设置要编辑的对象,但我不明白主视图控制器如何知道 BNRItem 已更改,然后将其设置回表视图?

除了作者在主控制器 (ItemsViewController.m ) 中写了一个 setter 之外,它可以被详细视图控制器 (DetailViewController.m) 调用,给出新的 BNRItem。 但是这部分有效 "automatically".

谢谢。

由于您在两个控制器中指向相同的内存块,因此在 DetailViewController 中所做的更改显然会在 ItemsViewController.m 中报告。