2014-01-15 15 views
6

Ich versuche, eine jede Zelle Zelle mit Fortschrittsbalken zu aktualisieren, aber ich bin fest. habe ich eine benutzerdefinierte Zelle für eine Tabellenansicht mit diesen Eigenschaften:Benutzerdefinierte UITableViewCell mit Fortschrittsbalken-Download-Update

@interface OFPTableCell : UITableViewCell 
@property (nonatomic, weak) IBOutlet UILabel *textLabel; 
@property (nonatomic, weak) IBOutlet UILabel *detailTextLabel; 
@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
@property (weak, nonatomic) IBOutlet UIProgressView *progressView; 
@end; 

und nach nur ihnen @synthesize, jetzt habe ich wie erwartet in jeder Tabelle einen Fortschrittsbalken Zelle.

Das Problem ist, dass wenn ich versuche, gerade 1 Zelle mit einem Lade-Fortschrittsbalken zu aktualisieren, es einfach nichts oder seine 0 oder volle Fortschrittsbalken setzen. Beachten Sie, dass der Download-Vorgang ordnungsgemäß funktioniert.

Bellow Sie den Code finden kann, wo ich versuche, den Fortschrittsbalken zu aktualisieren:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask   *)downloadTask didWriteData:(int64_t)bytesWritten 
    totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite: (int64_t)totalBytesExpectedToWrite 
{ 

     dispatch_async(dispatch_get_main_queue(), ^{ 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     OFPTableCell *cell = (OFPTableCell*)[self tableView:self.tableViewCache cellForRowAtIndexPath:indexPath]; 
     cell.progressView.progress=(double)totalBytesWritten/(double)totalBytesExpectedToWrite; 
}); 

} 

Unten ist die Methode cellForRowAtIndexPath:

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

    OFPTableCell *cell = [self.tableViewCache dequeueReusableCellWithIdentifier:@"Cell"]; 



    OFPVideoDetails *vd = [someArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text=vd1; 
    cell.detailTextLabel.text=vd2; 

    CGSize size = {65,53}; 
    cell.imageView.image =[self imageWithImage:[UIImage  imageWithContentsOfFile:vd.imageUrl] scaledToSize:size]; 



    cell.delegate = self; 



return cell; 
} 

Antwort

6

Es ist sehr schlechte Praxis Methode tableView:cellForRowAtIndexPath: direkt zu nennen ist, weil die Zelle nicht im selben Moment existiert, und es kann eine Ursache für den Fehler, den Sie haben sein.

Grundsätzlich sollte man dies auf eine andere Weise tun: eine Reihe von Doppel hinzufügen:

double progressValues[30]; // 30 is the count of rows on your tableView, you can set the size dynamically 

und es wie folgt verwendet werden:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten 
totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite: 
(int64_t)totalBytesExpectedToWrite 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    OFPTableCell *cell = (OFPTableCell*)[self tableView:self.tableViewCache cellForRowAtIndexPath:indexPath]; 
    progressValues[indexPath.row] = (double)totalBytesWritten/(double)totalBytesExpectedToWrite; 
    [self.tableViewCache reloadData]; 
}); 
} 

und in der Datenquelle Methode nur diese Zeichenfolge hinzufügen:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //... your code... 
    cell.progressView.progress = progressValues[indexPath.row]; 
    // ... 
    return cell; 
} 
+2

Eine weitere Frage anstelle von [self.tableViewCache reloadData]; Ich kann [self.tableViewCache neu ladenRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationNone]; ? – user3197376

+0

Ja, Sie sollten natürlich nur eine Zeile neu laden, die sich zur aktuellen Zeit ändert. Ich schrieb oben nur allgemeine Idee, ohne solche Details zu berücksichtigen :) – Miroslav

+0

Ich bekomme ** nil ** in: ** cell.progressView.progress = progressValues ​​[indexPath.row]; ** –

1

Sie den Wert halten sollte (double) totalBytesWritten/(double) totalBytesExpectedToWrite in OFPVideoDetails (fügen Sie eine Eigenschaft "progress" in OFPVideoDetails hinzu).

neu laden dann die Zelle in - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite: (int64_t)totalBytesExpectedToWrite

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    OFPTableCell *cell = [self.tableViewCache dequeueReusableCellWithIdentifier:@"Cell"]; 
    OFPVideoDetails *vd = [someArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text=vd1; 
    cell.detailTextLabel.text=vd2; 
    CGSize size = {65,53}; 
    cell.imageView.image =[self imageWithImage:[UIImage  imageWithContentsOfFile:vd.imageUrl] scaledToSize:size]; 
    cell.progressView.progress = vd.progress; 
    cell.delegate = self; 
    return cell; 
} 
+0

Was ist OFPVideoDetails? – user1374

Verwandte Themen