Uitableview Tableview重新加载不适用于父VC/子VC场景
我的tableview重新加载不起作用。请让我知道我是否正确地建模了我的设计,或者我需要更改它Uitableview Tableview重新加载不适用于父VC/子VC场景,uitableview,Uitableview,我的tableview重新加载不起作用。请让我知道我是否正确地建模了我的设计,或者我需要更改它 我有一个核心视图控制器,每个选项卡栏视图控制器都继承自这个核心视图控制器 每个选项卡栏视图控制器都有一个tableview,并实现UITableViewDelegate和UITableViewDataSource协议 如果应用程序是第一次启动,在core view controller的viewDidLoad中,我有一个从web获取数据的方法。在子视图控制器的viewDidLoad方法中,我有一个填
- 我有一个核心视图控制器,每个选项卡栏视图控制器都继承自这个核心视图控制器
- 每个选项卡栏视图控制器都有一个tableview,并实现UITableViewDelegate和UITableViewDataSource协议
- 如果应用程序是第一次启动,在core view controller的viewDidLoad中,我有一个从web获取数据的方法。在子视图控制器的viewDidLoad方法中,我有一个填充tableview数据源的方法李>
- 所以问题是在第一次启动时,数据被成功地提取并保存在核心数据中,但它不会重新加载tableview,因此它是空的
-(void)viewDidLoad
{
[超级视图下载];
如果(!self.myManagedObjectContext){
//获取managedObjectContext的共享实例
self.myManagedObjectContext=[LTDataModel sharedInstance].mainObjectContext;
//检查托管对象上下文是否具有所需的数据
......
如果({
[自取数据到上下文];
}
}
-(void)fetchDataIntoContext{
UIAlertView*消息=[[UIAlertView alloc]initWithTitle:@“正在初始化…”
信息:@“这是您第一次发布应用程序”
代表:无
取消按钮:@“确定”
其他按钮:无];
[信息显示];
UIView*loadingView=[[UILoadingView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:loadingView];
dispatch\u queue\u t fetchEventQ=dispatch\u queue\u create(“Fetcher”,NULL);
调度异步(fetchEventQ^{
[[LTDataModel sharedInstance]保存];
dispatch\u async(dispatch\u get\u main\u queue()^{
[[self.view.subviews lastObject]removeFromSuperview];
});
});
}
子视图控制器
-(void)setMyArrayOfEvents:(NSMutableArray*)myArrayOfEvents{
如果(_arrayOfMyEvents!=arrayOfMyEvents){
_arrayOfMyEvents=arrayOfMyEvents;
[self.eventTableView重载数据];
}
}
-(void)viewDidLoad{
[超级视图下载];
//获取managedObjectContext的共享实例(如果不存在)
如果(!self.myManagedObjectContext){
self.myManagedObjectContext=[LTDataModel sharedInstance].mainObjectContext;
}
//填充为tableview提供数据的数组
[self-populateTableViewArrayFromContext];
}
-(void)populateTableViewArrayFromContext
{
self.myArrayOfEvents=[[NSMutableArray alloc]initWithArray:localArray];
}
我解决了这个问题。问题不是因为没有调用子VC的viewDidLoad。在后台提取数据完成之前,加载视图被删除
因此,我添加了一个函数来填充核心(父)视图控制器中的数据源数组,该函数的主体为空。子VC实现了该功能。并在移除加载视图之前调用了该方法。请看下面我在coew视图控制器中更改的代码
核心视图控制器
-(void)fetchDataIntoContext{
UIAlertView*消息=[[UIAlertView alloc]initWithTitle:@“正在初始化…”
信息:@“这是您第一次发布应用程序”
代表:无
取消按钮:@“确定”
其他按钮:无];
[信息显示];
UIView*loadingView=[[UILoadingView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:loadingView];
dispatch\u queue\u t fetchEventQ=dispatch\u queue\u create(“Fetcher”,NULL);
调度异步(fetchEventQ^{
[[LTDataModel sharedInstance]保存];
dispatch\u async(dispatch\u get\u main\u queue()^{
**[self-populateTableViewArrayFromContext]**
[[self.view.subviews lastObject]removeFromSuperview];
});
});
}
-(void)populateTableViewArrayFromContext{
//清空子VC中的implementation
}
- (void)viewDidLoad
{
[super viewDidLoad];
if (!self.myManagedObjectContext) {
//Get Shared Instance of managedObjectContext
self.myManagedObjectContext = [LTDataModel sharedInstance].mainObjectContext;
//Check if managed object context has required data
......
if (<data not found> {
[self fetchDataIntoContext];
}
}
-(void)fetchDataIntoContext {
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Initializing..."
message:@"This is your first launch of App"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[message show];
UIView *loadingView = [[UILoadingView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:loadingView];
dispatch_queue_t fetchEventQ = dispatch_queue_create("Fetcher", NULL);
dispatch_async(fetchEventQ, ^{
<add data to core data>
[[LTDataModel sharedInstance] save];
dispatch_async(dispatch_get_main_queue(), ^{
[[self.view.subviews lastObject] removeFromSuperview];
});
});
}
--(void)setMyArrayOfEvents:(NSMutableArray *)myArrayOfEvents {
if (_arrayOfMyEvents != arrayOfMyEvents) {
_arrayOfMyEvents = arrayOfMyEvents;
[self.eventTableView reloadData];
}
}
-(void) viewDidLoad {
[super viewDidLoad];
//Get Shared Instance of managedObjectContext if it does not exist
if (!self.myManagedObjectContext) {
self.myManagedObjectContext = [LTDataModel sharedInstance].mainObjectContext;
}
//Populate the array which feeds the tableview
[self populateTableViewArrayFromContext];
}
-(void)populateTableViewArrayFromContext
{
<Fetch data dfrom Core Data ......>
self.myArrayOfEvents = [[NSMutableArray alloc] initWithArray:localArray];
}
-(void)fetchDataIntoContext {
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Initializing..."
message:@"This is your first launch of App"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[message show];
UIView *loadingView = [[UILoadingView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:loadingView];
dispatch_queue_t fetchEventQ = dispatch_queue_create("Fetcher", NULL);
dispatch_async(fetchEventQ, ^{
<add data to core data>
[[LTDataModel sharedInstance] save];
dispatch_async(dispatch_get_main_queue(), ^{
**[self populateTableViewArrayFromContext];**
[[self.view.subviews lastObject] removeFromSuperview];
});
});
}
-(void)populateTableViewArrayFromContext {
//empty the implemetation is in Child VC
}