0

我想知道是否有一个好的、通用的范例可以在任意深度的 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 中的任何级别访问。那会是正确的吗?

4

1 回答 1

0

例如,您可以刷新您的模型(可以传递给视图控制器)并在viewWillAppear.

您提到的通知方式也将起作用。viewDidLoad在您的方法中注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(selectorThatReloadsTheTableView:) 
                                             name:@"NameOfYourNotification"
                                           object:nil];

不要忘记通过调用从通知中心远程您的视图控制器

[[NSNotificationCenter defaultCenter] removeObserver:self];

现在您需要做的就是在用户拉动刷新后发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" 
                                                    object:nil];
于 2013-11-06T22:29:02.633 回答