3

Я использую этот код:Обновление iPhone UIProgressView во NSURLConnection скачать

NSURLConnection *oConnection=[[NSURLConnection alloc] initWithRequest:oRequest delegate:self]; 

загрузить файл, и я хочу, чтобы обновить индикатор на подвид, что я загружаю. Для этого я использую этот код:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [oReceivedData appendData:data]; 
float n = oReceivedData.length; 
float d = self.iTotalSize; 
NSNumber *oNum = [NSNumber numberWithFloat:n/d]; 
self.oDPVC.oProgress.progress = [oNum floatValue]; 
} 

подтаблицы является oDPVC, а индикатор на нем oProgress. Установка свойства progress не обновляет элемент управления.

Из того, что я читал в Интернете, многие люди хотят это сделать, но все же нет полной, надежной выборки. Кроме того, есть много противоречивых советов. Некоторые люди думают, что вам не нужен отдельный поток. Некоторые говорят, что вам нужен фоновый поток для обновления хода. Некоторые говорят «нет», делают другие вещи в фоновом режиме и обновляют ход основного потока.

Я пробовал все советы, и ничто из этого не работает для меня.

Еще одна вещь, может быть, это ключ. Я использую этот код для загрузки подвид во applicationDidFinishLaunching:

self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil]; 
[window addSubview:self.oDPVC.view]; 

В файле XIB (который я исследовал как в Interface Builder и в текстовом редакторе) индикатор хода составляет 280 пикселей в ширину. Но когда открывается представление, оно каким-то образом настроено на половину этой ширины. Кроме того, фоновым изображением представления является default.png. Вместо того, чтобы появляться прямо поверх изображения по умолчанию, оно запирается примерно на 10 пикселей, оставляя белую полосу в нижней части экрана.

Возможно, это отдельный вопрос, возможно, нет.

ответ

3
self.oDPVC.oProgress.progress = [oNum floatValue]; 

Установка свойства прогресса не обновления элемента управления.

Какая ценность self.oDPVC (это nil)?

Какая ценность self.oDPVC.oProgress (это nil)?

Пара других точек.

Первое:

self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController"bundle:nil]; 

Как ваша oDPVC@property определяется? Если он использует retain, эта строка может (позже) привести к утечке памяти (она будет двойной retain -ed). Вы должны использовать этот шаблон вместо:

DownloadProgressViewController* dpvc = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil]; 
self.oDPVC = dpvc; 
[dpvc release]; 

Второе:

float n = oReceivedData.length; 
float d = self.iTotalSize; 
NSNumber *oNum = [NSNumber numberWithFloat:n/d]; 
self.oDPVC.oProgress.progress = [oNum floatValue]; 

Свойство progress является сам поплавок. Вам не нужно использовать объект NSNumber.Вы также можете захотеть добавить один к знаменателю, чтобы избежать деления на ноль:

float n = oReceivedData.length; 
float d = self.iTotalSize; 
float percentCompleted = n/(d + 1.0f); 
self.oDPVC.oProgress.progress = percentCompleted; 
+0

Я ценю ваше замечание о двойном удержании. Я мог бы узнать гораздо больше об этой теме. self.oDPVC не является нулевым, потому что я успешно добавляю его subview в окно. self.oDPVC.oProgress не ноль, потому что я могу проверить его ширину следующим образом: CGRect newFrame = self.oDPVC.oProgress.frame; NSLog (@ "Progress width:% f", newFrame.size.width); Наконец, деление на ноль не является проблемой, поскольку мой знаменатель - это ожидаемые общие байты, и это никогда не будет равным нулю. –

+0

Я должен добавить, что, когда я тестирую ширину oProgress, это 160, а не 280, как было установлено в IB. Еще одна подсказка о индикаторе прогресса: некоторые люди сообщают, что индикатор выполнения остается равным нулю и достигает 100 в конце своей задачи. Шахта НИКОГДА не меняется с нуля. –

+0

Все проблемы решены. У default.png было пустое пространство, потому что в IB оно было изменено, чтобы освободить место для строки состояния, и я этого не знал. Индикатор выполнения был неправильным, потому что у меня был некоторый код в моем представленииDidLoad, который запускал другой UIProgressView или перезапускал существующий. Удаление этой строки кода приводит к тому, что индикатор выполнения должен быть ожидаемым, плюс теперь он обновляется, и мне не нужно было обманывать нитями. Мораль: вы всегда находите то, что ищете в последнем месте, которое вы смотрите! –

 Смежные вопросы

  • Нет связанных вопросов^_^