Делегат установлен неправильно

#ios #iphone #inheritance #delegates #delegation

#iOS #iPhone #наследование #делегаты #делегирование

Вопрос:

Я работаю над проектом, и моему классу UIWebView необходимо выполнить метод из моего класса DownloadView

Я использую проект с открытым исходным кодом https://github.com/robertmryan/download-manager

Когда этот код выполняет метод:

  DownloadTableView *download = [[DownloadTableView alloc] init];
 [download queueAndStartDownloads:_downloadURL];
  

Эта строка не устанавливает делегат правильно

   self.downloadManager = [[DownloadManager alloc] initWithDelegate:self];
  

Весь метод начальной загрузки

 - (void)queueAndStartDownloads:(NSURL *)url
{


NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *downloadFolder = [documentsPath stringByAppendingPathComponent:@"downloads"];

if ([[NSFileManager defaultManager] fileExistsAtPath:downloadFolder])       //Does file exist?
{
    if (![[NSFileManager defaultManager] createDirectoryAtPath:downloadFolder
                                   withIntermediateDirectories:NO
                                                    attributes:nil
                                                         error:nil]) {

    }
}

self.downloadManager = [[DownloadManager alloc] initWithDelegate:self];
self.downloadManager.maxConcurrentDownloads = 4;


    NSString *downloadFilename = [downloadFolder stringByAppendingPathComponent:[url lastPathComponent]];
    [self.downloadManager addDownloadWithFilename:downloadFilename URL:url];


self.cancelButton.enabled = YES;
self.startDate = [NSDate date];
NSLog(@"DOwnling");
[self.downloadManager start];

}
  

Методы в моем классе DownloadView не будут выполняться

  - (void)didFinishLoadingAllForManager:(DownloadManager *)downloadManager
  

{

Комментарии:

1. Вы не показали достаточно кода, чтобы точно определить проблему. Но в целом не создавайте метод «initWithDelegate», это не обычный способ ведения дел. Используйте назначенный инициализатор для вашего класса (или подкласса) и после этого назначьте делегата.

2. Я использую этот менеджер загрузки, ребята github.com/robertmryan/download-manager

3. Если требуется делегат, то я не вижу ничего плохого в том, что назначенный инициализатор является initWithDelegate .

4. Конечно, вы можете игнорировать соглашения. Но это помогает делать то, что Apple и все остальные делают, если вы хотите работать с другими.

5. Что для вас значит «неправильно назначает делегата»? Что вы ожидали, что произойдет? Что вы заметили, что вас удивило?

Ответ №1:

Предполагая, что ваш код находится под ARC, из кода я понимаю, что DownloadTableView *download это локальная переменная. Следовательно DownloadTableView , объект освобождается после завершения области действия метода, в котором он объявлен. Следовательно, метод делегата не вызывается, потому что делегат освобожден. Чтобы избежать этого, вы можете создать DownloadTableView объект в качестве переменной экземпляра.

Комментарии:

1. Спасибо за совет, он работает, но представление таблицы по-прежнему не обновляется, есть идеи, почему?

2. Вы вызываете reloadData?