艾伦,
您关于“为了让它显示除第一个之外的任何数据的新数据”的声明让我很担心 - 因为它告诉我您可能只有一个 DetailsViewController 实例。
在您的第一个表视图 ItemsViewController 中,您可能有一个 didSelectRowAtIndexPath: 方法用于将 DetailsViewController 推入 UINavigationController 堆栈。
我解决此问题的方法是在每次用户在视图之间点击时创建/销毁一个新的 DetailsViewController。所以,我的didSelectRowAtIndexPath: 通常看起来像:
- (void) didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
NSInteger selectedRow = indexPath.row;
// Create a new view controller
DetailsViewController *tmpVC = [[DetailsViewController alloc] initWithNibName:@"foo" bundle:nil];
// Tell our new view controller what data it should be using
tmpVC.tableData = [self.someArrayOfData objectAtIndex:selectedRow];
// Push view controller and release it
[self.navigationController pushViewController:tmpVC animated:YES];
[tmpVC release];
}
此示例假定您在 ItemsViewController 中拥有两个视图控制器所需的所有数据 - 情况可能并非如此..?
无论如何,通过这种方式,您的 DetailsViewController 会自动加载数据。当您点击“返回”返回 ItemsViewController 时,UINavigationController 将释放它并销毁它。然后,当用户点击不同的单元格时,我们再次运行这段代码,创建一个带有全新数据的全新控制器 - 当然,当它显示时,它会自动加载数据 - 它以前从未显示过。
听起来您在代码中所做的可能是将DetailsViewController 保留为ItemsViewController 类的属性,然后重用该对象。如果您关心分配,这也可以工作(例如,如果它是一个非常“重”的分配来制作 DetailsViewController),但我认为调用 reloadData 的最佳位置不在类本身内部 - 但是而不是来自 ItemsViewController 的didSelectRowAtIndexPath: 方法。
我提倡创建/销毁方法而不是“享元模式”方法的原因是它使您的代码更加独立 - 视图控制器之间的链接越少越好。当然,ItemsViewController 将始终依赖并了解 DetailsViewController,但不一定非要反过来 - 如果您将 reloadData 调用添加到 viewWillAppear:animated:,您将隐式添加非代码依赖项他们俩。您知道当 ItemsViewController 是导航堆栈中的“父级”时,这是正确的行为——但是如果您突然开始在不需要重新加载的应用程序的其他部分重用该视图怎么办?这对一个人来说是一个性能问题,而且,它是一种隐藏的依赖关系,有一天可能会导致令人讨厌的跟踪错误。因此,如果确实只需要 1 个 DetailsViewController(而不是我每次都重新创建它的第一个想法),我会让 Details 变得愚蠢并让 Items 包含所有复杂性。