详细视图控制器如何告诉主控制器所做的更改?

时间:2015-05-23 21:09:38

标签: object uinavigationcontroller

我正在阅读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)中,有一种方法可以保存"正在更改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已被更改,然后将其设置回tableview?

我除了作者在主控制器(ItemsViewController.m)中编写一个setter,它可以被详细视图控制器(DetailViewController.m)调用,给出新的BNRItem。 但是这部分可以自动运行"。

谢谢。

1 个答案:

答案 0 :(得分:0)

当您指向两个控制器中的相同内存块时,DetailViewController中显示的更改显然在ItemsViewController.m中报告。