艾伦,
你的声明“为了得到它显示在任何但是第一个新的数据”我担心 - 因为它告诉我,你有可能有一个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:
方法。
我推动创建/销毁方法而不是“flyweight模式”方法的原因是它使代码更加分离 - 视图控制器之间的联系越少越好。当然,ItemsViewController将始终依赖和了解DetailsViewController,但它不一定必须是另一种方式 - 如果将reloadData调用添加到viewWillAppear:animated:
,则隐式地在两者之间添加了非代码依赖关系。您知道当ItemsViewController是导航堆栈中的“父”时,这是正确的行为 - 但是如果您突然开始在应用的其他部分重新使用该视图而不需要重新加载,该怎么办?这是一个性能问题,而且,它是一种隐藏的依赖性,可能最终会在一天内出现一个令人讨厌的跟踪错误。所以,如果确实需要只有1个DetailsViewController(而不是每次重新创建它的第一个想法),我会保持细节愚蠢并使项目包含所有复杂性。
从什么是上面这个代码段? ItemsView或DetailsView ...你说他们都是桌子。 – 2010-10-31 05:05:41
对不起,我应该提到。这是来自DetailsView。 – Alan 2010-11-01 10:46:32