UIActivityIndicatorView solo aparece después de que finaliza la carga

En mi UITableView, estoy usando celdas personalizadas con el título del libro, el estado del libro y el botón de renovación. Sin embargo, el estado del libro requiere alguna vista de carga de Internet y, por lo tanto, toma tiempo para cargar.

Intenté hacer Asynchronous para cargar solo la parte en el estado del libro, pero es demasiado difícil. Por lo tanto, estaba tratando de hacer una rueda de "Carga de datos" en su lugar. Había creado una clase para spinner e implementada en cellForRowAtIndexPath ¡pero la rueda giratoria solo se muestra al final cuando mi UITable ya había terminado toda la carga! No tengo idea de dónde colocar estos códigos:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    lVC = [[LoadingViewController alloc] initWithNibName:@"LoadingViewiPad" bundle:nil];
    [self.parentViewController.view addSubview:lVC.view];
} else {
    lVC = [[LoadingViewController alloc] init];
    [self.parentViewController.view addSubview:lVC.view];
}

Ya he probado a colocarlo viewDidLoad e incluso viewWillAppear pero simplemente no parecía funcionar. Los resultados de todo terminan en que la ruleta aparece al final cuando todas las cosas ya habían terminado de cargarse.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UserCustomCell *cell = (UserCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"UserCustomCell" owner:self options:nil];
    cell = userCustomCell;
    self.userCustomCell = nil;
}

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    cell.bookTitle.frame = CGRectMake(12, 0, 550, 40);
    cell.renewButton.frame = CGRectMake(600, 14, 68, 24);
}
[cell.renewButton useBlackActionSheetStyle];

cell.bookTitle.text =@"Book Title";

// I place the UIActivityIndicator class here before I do the loading
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    lVC = [[LoadingViewController alloc] initWithNibName:@"LoadingViewiPad" bundle:nil];
    [self.parentViewController.view addSubview:lVC.view];
} else {
    lVC = [[LoadingViewController alloc] init];
    [self.parentViewController.view addSubview:lVC.view];
}
NSString *reservation = [self noOfRenewalLeft:index];   ###### throw into method to do internet connection and checking
                                                                                                //method will then return NSString "reserved" or "notReserved"

if ([reservation isEqualToString: @"notReserved"]){     //if item not reserved

    if([renewalLeftString isEqualToString: @"0"]){              
        cell.bookStatus.text = @"Reached Max Renewal Limit";
    }
    else{                                                   //item not reserved & able to renew, therefore display renewal left
        cell.bookStatus.text = [NSString stringWithFormat:@"Renewal Left: %@",renewalLeftString];
    }
}
else {
    cell.bookStatus.text = @"Item Reserved/On-Hold";
}

cell.renewButton.tag = index_tag;
return cell;

}

preguntado el 24 de agosto de 12 a las 08:08

¿Puedes mostrar más código donde colocas la línea de código anterior y dónde cargas la solicitud de envío? -

Coloque su UIActivityIndicator antes de cargar cualquier cosa... y elimínelo cuando termine de cargar... -

@CocoaMatters ¡Está actualizado! :) Puse el UIActivityIndicator antes de hacer mi carga en mi otro método noOfRenewalLeft -

Lo coloqué antes de cargar. Para fines de prueba, no lo eliminé como si lo eliminara, el indicador ni siquiera aparece. En este momento, se muestra después de que UITable haya terminado de cargar todo. -

¿Dónde estás colocando ActivityIndicator? -

4 Respuestas

Simplemente use el indicador de actividad predeterminado de Apple y colóquelo en la celda. No necesitas una clase para ello. Luego, cree una notificación cuando haya terminado de cargar o un método delegado que se llamará cuando finalice la carga. Este método luego quita la rueda giratoria y coloca el contenido correcto en la celda. Después de eso, actualice las celdas que han terminado de cargarse y eso es todo.

Respondido 24 ago 12, 08:08

Evento aunque no publicaste los detalles de noOfRenewalLeft Supongo que se está cargando en el hilo principal y por eso lo bloquea. Por lo tanto, su indicador de actividad no se puede representar antes de que continúe el hilo principal (después de finalizar la descarga). Pruebe la descarga y delegación asincrónicas.

Respondido 24 ago 12, 08:08

Cree un método individual y llame a ese método usando performselector en segundo plano para cargar el indicador de actividad porque carga cualquier cosa desde Internet como carga en el hilo principal para que el indicador de actividad se cargue una vez que finalice el proceso de descarga.

Respondido 24 ago 12, 09:08

Al final, lo que hice fue colocar el UIActivityIndicator en el método viewDidLoad y lo cancelé en viewDidAppear. ¡Ahora funciona! Gracias a todos por su ayuda también :)

Respondido 26 ago 12, 18:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.