2015-02-26 18 views
15

Ho una vista tabella e in quella vista tabella ho un UIActivityIndicator con un pulsante in ogni cella. Ora su clic su quel pulsante voglio avviare ActivityIndicator animando, il suo avvio. Ma il problema è quando scorro la vista tabella smette di animare. Ecco il mio codice per cellForRowAtIndexPathUIActivityIndicatorView interrompe l'animazione in UITableViewCell

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"txDevicesListCellID"]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"txDevicesListCellID"]; 
    } 
    UIButton *buttonutton = (UIButton *)[cell viewWithTag:103]; 
    UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [cell viewWithTag:104]; 
    button.tag = indexPath.row; 
    return cell; 
} 

e il metodo di selezione per il mio pulsante è

-(IBAction)recevierButtonClick:(id)sender{ 
    UIButton *button = (UIButton *)sender; 
    NSInteger index = button.tag; 
    NSIndexPath* indexpath = [NSIndexPath indexPathForRow:serialNumber inSection:0]; 
    UITableViewCell* cell = [self.myTableView cellForRowAtIndexPath:indexpath]; 
    activityIndicator = (UIActivityIndicatorView*)[cell viewWithTag:index]; 
    [activityIndicator startAnimating]; 
} 
+0

se (cella == nil) { cella = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: @ "txDevicesListCellID"]; UIButton * button button = (UIButton *) [cella viewWithTag: 103]; UIActivityIndicatorView * activityIndicator = (UIActivityIndicatorView *) [cella viewWithTag: 104]; } button.tag = indexPath.row; prova questo. a causa della reinizializzazione dell'indicatore di attività che non sta animando. –

risposta

2

Sarà necessario mantenere la quale cella di indicatore di attività è stato avviato come tableView quando scorrimento carico nuovo visibile in sequenza delle cellule. Di conseguenza il tuo indicatore di attività viene fermato.

Utilizzare una matrice per lo stato dell'indicatore di attività che sarà oggetto membro della classe.

NSMutableArray *mutArrActIndStatus; 

//Intialization 
mutArrActIndStatus = [NSMutableArray array]; 

Ora aggiungere oggetto pari a tableView origine dati. Nota 1 significa avviato e 0 arresto medio. Quindi intially tutti in stato di

for(int i=0; i<[yourTableViewArray count]; i++) 
{ 
    [mutArrActIndStatus addObject:@"0"]; 
} 

Ora usare questo nel vostro tableView arresto:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //............... 
    //................ 

    UIActivityIndicatorView *activityIndicator = (UIActivityIndicatorView *) [cell viewWithTag:104]; 
    button.tag = indexPath.row; 

    NSString *strActIndStatus = mutArrActIndStatus[indexPath.row]; 
    if([strActIndStatus isEqualToString:@"1"]) 
    { 
     [activityIndicator startAnimating]; 
    } 

    return cell; 
} 

Avanti apportare modifiche nel metodo di pulsante per sostituire lo stato di indicatore di attività di

-(IBAction)recevierButtonClick:(id)sender{ 

    //for find index here to replace status of activity indicator 
    UIButton *btnSender = (UIButton *)sender; 
    [mutArrActIndStatus replaceObjectAtIndex:btnSender.tag withObject:@"1"]; 
} 
39

Credo può far luce su quando e come i filatori smettono di ruotare nelle cellule. Ho suddiviso la sottoclasse UIActivityIndicatorView con la mia classe, sovraccaricando le funzioni e stopAnimating e inserendo punti di interruzione. Ho creato una cella semplice con solo uno spinner della mia classe. Ho impostato la proprietà Animating dello spinner su true in IB: enter image description here

Ora ecco cosa succede. I primi due screenshot hanno una traccia dello stack che indica le due azioni (fermare le animazioni e l'avvio di loro) stanno accadendo uno dopo l'altro, nella stessa funzione privata _didMoveFromWindow:toWindow: enter image description here enter image description here

Mi sembra questo sta accadendo nel flusso di creazione della cella, quindi prima è inizializzato senza animazione e quindi le impostazioni IB entrano in azione e iniziano l'animazione. Ora ecco la parte interessante, quando l'ogiva si ferma l'animazione: enter image description here

Così sembra che il filatore continua a girare quando la cellula viene rimossa dallo schermo e si arresta quando il cellulare è pronto per essere mostrato sullo schermo ancora una volta (prepareForReuse) tramite la funzione privata _removeAllAnimations, che sembra ripetere in modo ricorsivo tutte le visualizzazioni figlio. Il problema è che per qualche motivo le funzioni private dell'UIKit non riattivano mai le animazioni e il startAnimating non viene mai chiamato. In realtà IMO la disabilitazione delle animazioni è il vero problema.

La soluzione che propongo, e non è perfetto, ma è evidentemente quello che Apple si aspetta da noi, è sottoclasse l'UITableViewCell per le celle che contengono i filatori e ri-consentendo loro in prepareForReuse:

class SpinnerCell: UITableViewCell { 
    @IBOutlet weak var spinner: UIActivityIndicatorView? 

    override func prepareForReuse() { 
     super.prepareForReuse() 
     if let spinner = self.spinner { 
      spinner.startAnimating() 
     } 
    } 
} 

o in Obj -C:

@interface SpinnerCell 

@property (weak) IBOutlet UIActivityIndicatorView *spinner; 

@end 

@implementation SpinnerCell 

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    [self.spinner startAnimating]; 
} 

@end 
+1

OFM è il prefisso perfetto per questa situazione – hfossli

+0

Siamo qui all'ordine francescano come anche il nostro prefisso Obj-C. – user3099609

+0

Divertente! Spero tu stia scherzando. Se non spero che questo non ti offenda, ma per coloro che non hanno familiarità con l'Ordine Francescano, si può pensare a http://www.urbandictionary.com/define.php?term=ofm&defid=3084325 invece di Ordine dei Frati Minori (OFM). – hfossli