Pentru a actualiza UIProgressView pentru descărcare de fișiere multiple (cum se utilizează delegat)?

Încerc să actualizez valoarea progresului de descărcare a fișierelor multiple la UIProgressView pe o celulă de tabel. Am clasa FileDownloader care are NSOperationQueue care face operațiuni de descărcare asincrone. Mă gândesc să actualizez interfața de utilizare folosind un „delegat” din clasa FileDownloader. Dar nu pot compila codurile. Am FileDownloader ca Singleton. Mă întreb dacă îmi lipsește să înțeleg ceva fundamental.

Mai jos este configurarea codului.

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 

În primul rând, am primit eroarea de compilare „nu pot găsi declarația de protocol pentru FileDownloaderDelegate” în MyTableViewCell. Așa că am mutat declarația de protocol a FileDownloaderDelegate într-un fișier .h separat pentru a putea compila. Chiar și atunci, încă nu pot aloca delegatului din tableViewController folosind

[[FileDownloader sharedInstance] setDelegate:myTableViewCell];

Am primit avertismentul „FileDownloader poate să nu răspundă la metoda setDelegate”, adică nu cunoaște delegatul (deși am „@synthesize delegat”). Mă întreb dacă nu înțeleg ceva despre utilizarea singletonului sau a delegatului.


person tmin    schedule 14.12.2009    source sursă


Răspunsuri (1)


Metoda dvs. +sharedInstance returnează un ContentSyncer*, nu un FileDownloader*. Aceasta poate fi cauza avertismentului setDelegate: not found.

De asemenea, puteți și ar trebui să vă definiți protocolul FileDownloaderDelegate în FileDownloader.h. Importați acest fișier antet în MyTableViewCell.h, dar utilizați ghilimele în loc de paranteze. De exemplu.,

#import "FileDownloader.h"
person Darren    schedule 15.12.2009
comment
Multumesc pentru raspuns. ContentSyncer a fost un rămas când am redenumit clasele pentru a face codul mai ușor de citit pentru postare aici. Am reeditat codul. Codul este compilat după ce am separat declarația de protocol într-un fișier separat, conform unei sugestii de aici. stackoverflow.com/ questions/1233371/ Am citit undeva că ar putea exista niște importuri circulare. Dar nu știu unde se întâmplă asta. Acum pot obține actualizări de la tableCell a UI. Singurul lucru rămas este avertismentul compilatorului când desemnez delegatul. Mulțumesc! - person tmin; 15.12.2009