1

我想运行代码 [tableView reloadData],除了我想将它从一个单独的类调用到我想重新加载数据的视图控制器。

(注意。如果重新加载 tableview 比 reloadData 更有效,请加入)。

假设我要重新加载的视图是“RootViewController”,而我目前在“DetailViewController”中,我需要做什么才能使其工作。

我现在最好的尝试是 [RootViewController.tableView reloadData],但它不正确。(我得到错误:预期的':'之前。令牌。

问候,@norskben

4

2 回答 2

9

您可以使用通知或协议。

使用通知:

在完成保存数据之后和从方法返回之前发布通知。像这样的东西:

// 发布通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"DataSaved" object:nil];

在处理表的控制器中,实现

- (void) dataSaved:(NSNotification *)notification{

    [self.tableView reloadData];

}

并在其viewDidLoad方法中添加以下代码以注册通知:

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

最后,在dealloc方法中取消注册添加

[[NSNotificationCenter defaultCenter] removeObserver:self];

使用协议:

开始使用您以前的控制器可以使用的回调创建协议。

@protocol dataSavedDelegate
-(void)dataSaved;
@end

完成数据保存后:

[(id< dataSavedDelegate >)object dataSaved];

现在,在您以前的控制器中,您处理委托方法:在dataSaved()您重新加载表的方法中。

于 2010-01-27T17:35:30.533 回答
1

您需要在 DetailViewController 中引用您的 RootViewController 实例。在 DetailViewController 中声明一个属性,并在实例化 DetailViewController 时(我假设来自 RootViewController),将其设置为

// in RootViewController.m
detailController.rootController = self;
[self.navigationController pushViewController:...

然后您可以从详细控制器访问根控制器:

[self.rootController.tableView reloadData];

另一种方法是当您希望 RootController 重新加载并让 RootController 侦听通知时,在 DetailViewController 中发布自定义 NSNotification。

另一种方法是仅在用户返回根控制器时才重新加载表(在 RootViewController 的 viewWillAppear: 方法中执行),为什么要重新加载甚至不在屏幕上的表?

于 2010-01-27T17:34:57.780 回答