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

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

Далее идет настройка кода.

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 

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

[[Общий экземпляр FileDownloader] setDelegate:myTableViewCell];

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


person tmin    schedule 14.12.2009    source источник


Ответы (1)


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

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

#import "FileDownloader.h"
person Darren    schedule 15.12.2009
comment
Спасибо за ответ. ContentSyncer был остатком, когда я переименовал классы, чтобы код было легче читать для размещения здесь. Я переделал код. Код скомпилирован после того, как я выделил объявление протокола в отдельный файл в соответствии с предложением отсюда. stackoverflow.com/ вопросов/1233371/ Я где-то читал, что может быть циклический импорт. Но я не знаю, где это происходит. Теперь я могу получать обновления из tableCell пользовательского интерфейса. Единственное, что осталось, это предупреждение компилятора, когда я назначаю делегата. Спасибо! - person tmin; 15.12.2009