I have a MasterViewController in a MAster Detail aplication showind data in a UITableView.
Data is loading from internet in batches, so while the first load of data arrives I show a UIView with download activity.
While no data is loaded on the UITableView the activity indicator view is not visible. Then after this data is loaded and the app keeps loading more the activity indicator view is shown.
My MasterViewController implements delegate methods to get notice when the download process starts and ends for every batch of data.
- Why the UIView (self.downloadingProgrssView) loaded in
AEMEventosListDidStartLoadingEventos:is not visible the first time the method is called?
Here is the code:
-(void)AEMEventosListDidStartLoadingEventos:(AEMEventosList *)evList
{
// The views created here are not displayed the first time this method is called while the UITableView has no data.
//Once the TableView has been filled the followings calls to this method get the UIView displayed.
//Crear una vista con un idicador de progreso.
//Ancho y alto de activity Indicator
int widthAndHeigth = 30;
//Tamaño de activityIndicator
CGRect activityViewFrame = CGRectMake(10, 5, 20, 20);
//Tamaño de titleView
CGRect titleViewFrame = CGRectMake(widthAndHeigth + 20, 0, self.parentViewController.view.frame.size.width - widthAndHeigth, widthAndHeigth);
//Tamaño de downloadgingProgressView
CGRect downloadingProgressFrame = CGRectMake(0 + 20, self.parentViewController.view.frame.size.height - widthAndHeigth, self.parentViewController.view.frame.size.width - 40, widthAndHeigth + 13);
//Leyenda de la ventana.
NSString *title;
switch (evList.downloadingEventosGroupFlag) {
case 0:
title = NSLocalizedString(@"Downloading today's events", @"Downloading today's events leyend.");
break;
case 1:
title = NSLocalizedString(@"Downloading events in a week", @"Downloading events in a week leyend.");
break;
case 2:
title = NSLocalizedString(@"Downloading events in a month", @"Downloading events in a month leyend.");
break;
case 3:
title = NSLocalizedString(@"Downloading later events", @"Downloading later events leyend.");
break;
default:
title = @"";
break;
}
UIActivityIndicatorView *acView = [[UIActivityIndicatorView alloc] initWithFrame:activityViewFrame];
acView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
acView.hidesWhenStopped = NO;
acView.tag = kActivityIndicatorViewTag;
[acView startAnimating];
UILabel *titleView = [[UILabel alloc] initWithFrame:titleViewFrame];
titleView.text = title;
titleView.font = [UIFont systemFontOfSize:11];
titleView.backgroundColor = [UIColor clearColor];
titleView.textColor = [UIColor whiteColor];
titleView.tag = kNameViewTag;
UIView *aux = [[UIView alloc] init];
self.downloadingProgressView = aux;
[aux release];
self.downloadingProgressView.frame = downloadingProgressFrame;
self.downloadingProgressView.backgroundColor = [UIColor colorWithRed:0.3 green:0.4 blue:0.6 alpha:0.9];
// self.downloadingProgressView.tag = kDownloadingProgessViewTag;
downloadingProgressView.layer.cornerRadius = 13;
[self.downloadingProgressView addSubview:acView];
[self.downloadingProgressView addSubview:titleView];
[acView release];
[titleView release];
//Añadir la vista y animar
[self.parentViewController.view addSubview:self.downloadingProgressView];
[self.downloadingProgressView setFrame:CGRectMake( 20.0f, 480.0f, 280.0f, 480.0f)]; //notice this is OFF screen!
[UIView beginAnimations:@"animateTableView" context:nil];
[UIView setAnimationDuration:0.5];
[self.downloadingProgressView setFrame:downloadingProgressFrame]; //notice this is ON screen!
[UIView commitAnimations];
}
-(void)AEMEventosListDidFinishLoadingEventos:(id)evList {
//Reasignar ls nueva lista de eventos descargada
self.eventosList = evList;
//Recargar la tabla
[self.tableView reloadData];
//Eliminar la vista de progreso de descarga y animar
[UIView beginAnimations:@"animateTableView" context:nil];
[UIView setAnimationDuration:0.5];
[self.downloadingProgressView setFrame:CGRectMake( 20.0f, 480.0f, 280.0f, 480.0f)]; //notice this is OFF screen
[UIView commitAnimations];
self.downloadingProgressView = nil;
}
-(void)AEMEventosListDownloadingError:(AEMEventosList *)eventosList withError:(NSError *)error {
//Eliminar la vista de progreso de descarga
[[self.parentViewController.view viewWithTag:kDownloadingProgessViewTag] removeFromSuperview];
//Log el error
NSLog(@"%@", error);
//Mostrar un mensaje de error
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:NSLocalizedString(@"Download error", @"Alert View title for download error")
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
[alertView release];
}
The problem was I start the download process in the appController before I load the main view in
ApplicationDidFinishLaunching. The first call to the delegate method was to fast and the main view of the app was not displayed when I was attaching my view.I just move the code to start downloading after this code in the
applicationdidFinishLaunchingWithOptionsmethod and everything start working Ok.