我想运行代码[tableView reloadData],除了我想从一个单独的类调用它到我想重新加载数据的视图控制器。
(注意:如果重新加载tableview比reloadData更有效,请加入)。
假设我要重新加载的视图是'RootViewController',我目前在'DetailViewController'中,我需要做些什么才能使它工作。
我现在最好的尝试是[RootViewController.tableView reloadData],但它不对。 (我得到错误:预期':'之前。令牌。
问候,@ norskben
答案 0 :(得分:9)
您可以使用通知或协议。
使用通知:
在完成保存数据之后和从方法返回之前发布通知。像这样:
//发布通知 [[NSNotificationCenter defaultCenter] postNotificationName:@“DataSaved”对象: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()
方法中重新加载表格。
答案 1 :(得分: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:方法中执行),为什么重新加载甚至不在屏幕上的表?