3

ファイルをダウンロードするときにUICollectionViewCellのUIProgressViewを更新しようとしていますが、progressViewが更新される場合と更新されない場合があり、理由がわかりません。これはUICollectionViewCellを表示するためのコードです。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

static NSString *cellIdentifier = @"documentCell";

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

NSManagedObject *doc = [self.magDocument objectAtIndex:indexPath.row];

 UIButton *btn = (UIButton *)[cell viewWithTag:2003];
[btn addTarget:self action:@selector(addDocument:) forControlEvents:UIControlEventTouchUpInside];
UIProgressView *progressBar = (UIProgressView *)[cell viewWithTag:2005];

return cell;
}

これは、ダウンロードを開始するためのボタンです。

- (IBAction)addDocument:(id)sender
{
self.directCellPath = [self.myCollectionView indexPathForCell:(UICollectionViewCell *)[[sender superview] superview]];

NSManagedObject *document = [self.magDocument objectAtIndex:self.directCellPath.row];

[self loadLink:[document valueForKey:@"docUrl"]];
}

- (void)loadLink:(NSString *)urlDownload
{
UICollectionViewCell *cell = (UICollectionViewCell *)[self.myCollectionView cellForItemAtIndexPath:self.directCellPath];
UIProgressView *prg = (UIProgressView *)[cell viewWithTag:2005];

AFDownloadRequestOperation *request = [[AFDownloadRequestOperation alloc] initWithRequest:requestUrl targetPath:zipDownloadPath shouldResume:YES];

    [request setProgressiveDownloadProgressBlock:^(NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpected, long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile) {

            NSLog(@"%f",totalBytesReadForFile/(float)totalBytesExpectedToReadForFile);
        NSArray *progress = [NSArray arrayWithObjects:prg,[NSNumber numberWithFloat:totalBytesReadForFile/(float)totalBytesExpectedToReadForFile], nil];

        [self performSelectorOnMainThread:@selector(updateProgressBar:) withObject:progress waitUntilDone:NO];
    }];

    [self.downloadQueue addOperation:request];
 }

- (void)updateProgressBar:(NSArray *)progress
{
UIProgressView *pgr = (UIProgressView *)[progress objectAtIndex:0];
[pgr setProgress:[[progress objectAtIndex:1] floatValue]];
}

進行状況ビューが機能する場合と、1000回機能しない場合は、進行状況ビューを更新する方法がわかりません。何か助けはありますか?

4

2 に答える 2

2

customCellを作成し、その中にすべてのVisible UIViewを表示します(init、subviewを追加...)。cellForItemAtIndexPathでカスタムメソッドを使用してアクティブ化(表示)するよりも。MVCについて考える場合、cellForItemAtIndexPathは、ビューではなく、コントローラー専用です。

あなたの場合、すべてのIBAction、loadLink、updateProgressをcustomCellに持ってきて、それらをアクティブにするためにパラメーターを送信するか、CustomCellDelegateのような新しいプロトコルを作成して通信することができます。

詳細については、以下を確認してください。

コレクションビューセルにテキストを設定中にエラーが発生しました

于 2013-01-13T06:58:36.393 に答える
0

スレッドの問題に関する可能性があります。ちょうど試して

dispatch_async(dispatch_get_main_queue(), ^{
            UIProgressView *pgr = (UIProgressView *)[progress objectAtIndex:0];
            [pgr setProgress:[[progress objectAtIndex:1] floatValue]];
       });//end block

非同期または同期を試してください

于 2013-01-07T21:36:38.260 に答える