Чтобы обновить UIProgressView для загрузки нескольких файлов (как использовать делегат)? - PullRequest
0 голосов
/ 15 декабря 2009

Я пытаюсь обновить значение прогресса загрузки нескольких файлов до UIProgressView в ячейке таблицы. У меня есть класс FileDownloader, который имеет NSOperationQueue, который выполняет асинхронные операции загрузки. Я думаю, чтобы обновить пользовательский интерфейс с помощью «делегата» из класса FileDownloader. Но я не могу скомпилировать коды. У меня есть FileDownloader как синглтон. Мне интересно, не хватает ли мне понимания чего-то фундаментального?

Ниже приведена настройка кода.

FileDownloader.h

#import &lt Foundation/Foundation.h &gt
// declare protocol to accept progress status of file downloads
@protocol FileDownloaderDelegate &lt NSObject &gt
// 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 &lt FileDownloaderDelegate &gt delegate;  // to send progess value to UI
}

@property (nonatomic, retain) NSOperationQueue *operationQueue;
@property (nonatomic, assign) id &lt FileDownloaderDelegate &gt 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  &lt UIKit/UIKit.h &gt
#import &lt FileDownloader.h &gt
@interface MyTableViewCell : UITableViewCell &lt FileDownloaderDelegate &gt {
 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 

Во-первых, я получил сообщение о том, что " не может найти объявление протокола для FileDownloaderDelegate " в MyTableViewCell. Поэтому я переместил объявление протокола FileDownloaderDelegate в отдельный файл .h для возможности компиляции. Даже тогда я все еще не могу назначить делегату из моего tableViewController с помощью

[[FileDownloader sharedInstance] setDelegate: myTableViewCell];

Я получил предупреждение " FileDownloader" может не отвечать на метод setDelegate", означающее, что он не знает делегата (хотя у меня есть" @synthesize делегат "). Мне интересно, не понимаю ли я что-то об использовании синглтона или делегата.

1 Ответ

0 голосов
/ 15 декабря 2009

Ваш метод +sharedInstance возвращает ContentSyncer*, а не FileDownloader*. Это может быть причиной предупреждения setDelegate: not found.

Кроме того, вы можете и должны определить свой протокол FileDownloaderDelegate в FileDownloader.h. Импортируйте этот заголовочный файл в MyTableViewCell.h, но используйте кавычки вместо ангельских скобок. Например.,

#import "FileDownloader.h"
...