2009-12-14 8 views
0

J'essaie de mettre à jour la valeur de progression du téléchargement de plusieurs fichiers vers UIProgressView sur une cellule de table. J'ai la classe FileDownloader qui a NSOperationQueue qui effectue des opérations de téléchargement asynchrones. Je pense à mettre à jour l'interface utilisateur en utilisant un "délégué" de la classe FileDownloader. Mais je ne peux pas compiler les codes. J'ai FileDownloader comme Singleton. Je me demande s'il me manque pour comprendre quelque chose de fondamental.Pour mettre à jour UIProgressView pour le téléchargement de fichiers multiples (comment utiliser le délégué)?

Voici la configuration du code.

FileDownloader.h

#import < Foundation/Foundation.h > 
// declare protocol to accept progress status of file downloads 
@protocol FileDownloaderDelegate < NSObject > 
// this function will update the progressview and re-display the cell 
- (void) updateProgessWithCurrentValue:(NSNumber*)value totalValue:(NSNumber*)totalValue; 
@end 

@interface FileDownloader : NSObject { 
NSOperationQueue *operationQueue; // for file download operations 
id < FileDownloaderDelegate > delegate; // to send progess value to UI 
} 

@property (nonatomic, retain) NSOperationQueue *operationQueue; 
@property (nonatomic, assign) id < FileDownloaderDelegate > delegate; 


+(FileDownloader*) sharedInstance; // FileDownloader is Singleton with its standard methods 

// when download is progressing, the delegate function will be called like 
// [self.delegate updateProgessWithCurrentValue:10 totalValue:100]; 
// 

@end

MyTableViewCell.h

#import < UIKit/UIKit.h > 
#import < FileDownloader.h > 
@interface MyTableViewCell : UITableViewCell < FileDownloaderDelegate > { 
UIProgressView *progressView; 
} 

@property (nonatomic, retain) UIProgressView *progressView; 

// MyTableViewCell.m will have the implementation of 
// - (void) updateProgessWithCurrentValue:(NSNumber*)value totalValue:(NSNumber*)totalValue; 
// to update UI 

@end

D'abord, je suis arrivé "ne peut pas trouver la déclaration de protocole pour FileDownloaderDelegate" erreur du compilateur dans MyTableViewCell. J'ai donc déplacé la déclaration de protocole de FileDownloaderDelegate dans un fichier .h séparé pour pouvoir compiler. Même alors, je ne peux toujours pas affecter au délégué de mon tableViewController en utilisant

[[FileDownloader sharedInstance] setDelegate: myTableViewCell];

J'ai obtenu le « téléchargeur peut ne pas répondre à la méthode de setDelegate » avertissement, ce qui signifie qu'il ne connaît pas le délégué (bien que je « délégué @synthesize »). Je me demande si je ne comprends pas quelque chose au sujet de l'utilisation de singleton ou de délégué.

Répondre

0

La méthode +sharedInstance renvoie un ContentSyncer*, et non un FileDownloader*. Cela peut être la cause de l'avertissement setDelegate: not found.

De plus, vous pouvez et devez définir votre protocole FileDownloaderDelegate dans FileDownloader.h. Importez ce fichier d'en-tête dans MyTableViewCell.h, mais utilisez des guillemets au lieu des crochets anges. E.g.,

#import "FileDownloader.h" 
+0

Merci pour la réponse. Le ContentSyncer était un reste quand j'ai renommé les classes pour rendre le code plus facile à lire pour être posté ici. J'ai réédité le code. Le code est compilé après que j'ai séparé la déclaration de protocole dans un fichier séparé selon une suggestion d'ici. http://stackoverflow.com/questions/1233371/how-to-conform-to-a-self-made-protocol J'ai lu quelque part qu'il pourrait y avoir des "importations circulaires". Mais je ne sais pas où cela arrive. Maintenant, je peux obtenir des mises à jour de tableCell de l'interface utilisateur. La seule chose qui reste est l'avertissement du compilateur lorsque j'attribue le délégué. Thansk! – tmin