我想知道是否有一个好的、通用的范例可以在任意深度的 UITableView 中设置刷新操作。我说的是 UITableViewController 的 refreshControl 属性。
一层非常简单明了,因为您只需刷新模型然后调用 [self.tableView reloadData],但即使是两层也开始与我对良好 OO 编程的概念发生冲突。
因此,如果用户将表视图拉下以从任意深度的表中刷新,我会觉得从父视图重新加载数据绝对没有好处(在我看来,这样做不是一个好的 OO设置,因为子控制器不应该能够直接与父级对话)。刷新调用需要通过 UITableViewControllers 向上传递,直到顶部或某个可能是模型可能已更改的最深点的某个点,然后通过子 UITableViewControllers 向下推送新的、刷新的数据,直到它到达发起刷新的控制器(检查该路径是否在每次跳转时仍然存在)。
我想出的唯一方法是在每个控制器中都有一个名为 parentView 的属性,该属性在 prepareForSegue 期间设置,以及一个名为 dataForChildView 之类的方法。
-(IBAction)refreshTableView {
[self.refreshControl beginRefreshing];
//self.parentView would be nil at the topmost TVC
if (self.parentView) {
[self.parentView refreshTableView];
self.data = [self.parentView dataForChildView];
}
//refresh data
[self.tableView reloadData];
[self.refreshControl endRefreshing];
}
但在我看来,这违反了嵌套控制器的基本规则,原因我在上面说。
我还没有了解 NSNotifications,但这让我觉得这是一种可能的方法。但是,由于我在网上没有找到任何关于这个问题的信息,所以我想在花很多时间弄清楚 NSNotifications 是否会让我这样做之前先问一下。或者,也许我错过了一些更简单的方法。
编辑:这是设置的分配,只有最顶层的 UITableViewController 才能访问模型中的数据;所有较低的控制器都在 prepareForSegue 中传递他们的数据。我开始认为也许这就是问题所在;需要有一个模型可以从 UITableView 中的任何级别访问。那会是正确的吗?