2

まず、私のアプリの大まかな説明は、特定の組織向けの雑誌ライブラリ アプリです。

  1. ストーリーボードのプロトタイプでカスタマイズされた UICollectionViewCell があります。プロトタイプには、UIImageView、UILabel、UILabel の 3 つビューあります
  2. さらに、collectionView:cellForItemAtIndexPath:のインスタンスを作成しました

    • UIButton (アクション:@selector(downloadButtonTapped:))

    そして

    • UIProgressViewtag=indexPath.itemhidden=YES. _ 次に、セルのindexPath.itemと同じインデックスで、 UIProgressViewを配列 - self.progressViewArrayに追加します。
  3. 特定のセルの「ダウンロード」ボタンがタップされて呼び出されるたびに、 cellである送信者のスーパービューのスーパービューのcellindexPathdownloadButtonTapped:を取得します。次に、かどうかを確認します。条件が満たされた場合、実行されます。[self.progressViewArray[indexPath.item] tag] == indexPath.item[self.progressViewArray[indexPath.item] setHidden:NO]

22 個のオブジェクトのデータソースがあるため、22 個のセルがあります。これまでのところ、すべてが私が望むように機能します。ビューからセルをスクロールして (デキュー)、ビューに戻しても (リサイクル)、UIProgressView は残ります。

問題:

また、progressView は他のセルにも再表示されています。たとえば、セル 3 の [ダウンロード] ボタンをタップすると、そのセルに UIProgressView が正しく表示されますが、セル 10 と 19 にも「複製された」 UIProgressView が表示されます。この問題は、他のセルの場合にも当てはまります。たとえば、セル 20 の [ダウンロード] をタップすると、上にスクロールすると、セル 12 と 4 が表示され、雑誌もダウンロードされているかのように、UIProgressViews が同じように読み込まれます。

私が同じことを言ったsetDownloadProgressBlockのは、UIProgressViews の進行状況を更新する があり、セル 3、10、および 19 の進行状況 UIProgressViews が一緒に進行しているためです。

この問題について何日も頭を悩ませてきたので、ここで助けを見つけることができることを本当に願っています.

PS編集された以下のデバッグの試み。


関連するメソッドは次のとおりです。

collectionView:cellForItemAtIndexPath:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"Cell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    // * ========== Configure Cell ========== *
    // Initialisation of UIImageViews and UILabels here.
    // ...

    // CREATION OF CELL'S DOWNLOADBUTTON
    UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [downloadButton addTarget:self action:@selector(downloadButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
    [downloadButton setFrame:CGRectMake(178, 197, 140, 44)];
    [downloadButton setTitle:[self setDownloadButtonTitleAtIndexPath:indexPath.item] forState:UIControlStateNormal];
    [downloadButton setTitle:@"Downloading..." forState:UIControlStateDisabled];
    [downloadButton setEnabled:YES];
    [downloadButton setUserInteractionEnabled:YES];
    [downloadButton setTag:indexPath.item];
    [cell.contentView addSubview:downloadButton];


    // CREATION OF CELL'S UIPROGRESSVIEW
    UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
    [progressView setFrame:CGRectMake(20, 248, 150, 9)];
    [progressView setHidden:YES];
    [progressView setTag:indexPath.item];
    [self.progressViewArray addObject:progressView];

    // This chunk is to prevent creating new progress views when the cells are being recycled.
    if ([self.progressViewArray[indexPath.item] tag] != progressView.tag)
    {
        [self.progressViewArray replaceObjectAtIndex:indexPath.item withObject:progressView];
    }

    [cell.contentView addSubview:self.progressViewArray[indexPath.item]];
    // * ---------- Configure Cell ---------- *

    return  cell;
}

downloadButtonTapped:

- (IBAction)downloadButtonTapped:(id)sender
{
    // Get the indexPath of tapped row.
    UICollectionViewCell *cell = (UICollectionViewCell *)[[sender superview] superview];
    NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];

    // If file does not exist.
    if (![[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        // SHOW THE CELL'S HIDDEN UIPROGRESSVIEW
        if ([self.progressViewArray[indexPath.item] tag] == indexPath.item)
        {
            [self.progressViewArray[indexPath.item] setHidden:NO];
        }


        // AFHTTPRequestionOperation code here...

        // Track download progress.
        [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
         {
             for (UIProgressView *progressView in self.progressViewArray)
             {
                 if (progressView.tag == indexPath.item)
                 {
                     [progressView setProgress:(float) totalBytesRead / totalBytesExpectedToRead];
                 }
             }
         }];

        // Post download codes etc ...

        [operation start];
    }
}

お時間をいただきありがとうございます。それは有り難いです...

編集:

別のデバッグの試みとして、タップされたセルの UIProgressView のみが影響を受けること ( setHidden=NONSLog(@"%@ at indexPath #%d", self.progressViewArray[indexPath.item], indexPath.item); ) を確認する直前に行いましたが、実際にはそうです。return cell;

セル 3 のダウンロード ボタンをタップし、collectionViewの一番下までスクロールして、いつものようにセル 10 と 19 の progressViews もアクティブであるかのように見て、これがログに記録したものです。ご覧のとおり、ダウンロードがアクティブな間、ログには、セル 3 の progressView (tag=3) のみが ( setHidden=NO )であることが示されます。セル 10 と 19 はまだ非表示になっており、影響を受けていません。しかし、そこにアクティブな progressView が表示される理由がわかりません。

ログは次のとおりです。

2013-08-17 10:59:33.179 SFCCA[22885:907] <UIProgressView: 0x1c5bca00; frame = (20 248; 150 9); hidden = YES; opaque = NO; layer = <CALayer: 0x1c5d1000>> at indexPath #0
2013-08-17 10:59:33.187 SFCCA[22885:907] <UIProgressView: 0x1c59c7c0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 1; layer = <CALayer: 0x1c5bb310>> at indexPath #1
2013-08-17 10:59:33.193 SFCCA[22885:907] <UIProgressView: 0x1c5aa1f0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 2; layer = <CALayer: 0x1c5aa270>> at indexPath #2
2013-08-17 10:59:33.201 SFCCA[22885:907] <UIProgressView: 0x1c5b9860; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 3; layer = <CALayer: 0x1c5b9a30>> at indexPath #3
2013-08-17 10:59:33.207 SFCCA[22885:907] <UIProgressView: 0x1c5aa670; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 4; layer = <CALayer: 0x1c5b8d60>> at indexPath #4
2013-08-17 10:59:33.214 SFCCA[22885:907] <UIProgressView: 0x1c5b51d0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 5; layer = <CALayer: 0x1c5b5270>> at indexPath #5

// Here, I have tapped cell 3's "Download" button.
// Notice that at the bottom of the log, when I have scrolled off cell 3 and back, the log shows that the progressView (tag=3) in cell 3 is hidden=NO
2013-08-17 10:59:43.389 SFCCA[22885:907] {downloadButtonTapped} - File does not exist. Download then read PDF.
2013-08-17 10:59:43.929 SFCCA[22885:907] <UIProgressView: 0x1c5d5a10; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 6; layer = <CALayer: 0x1c5b4420>> at indexPath #6
2013-08-17 10:59:43.938 SFCCA[22885:907] <UIProgressView: 0x1c5cd8e0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 7; layer = <CALayer: 0x1c5b68d0>> at indexPath #7
2013-08-17 10:59:44.216 SFCCA[22885:907] <UIProgressView: 0x1d8c3b90; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 8; layer = <CALayer: 0x1d8c3c30>> at indexPath #8
2013-08-17 10:59:44.223 SFCCA[22885:907] <UIProgressView: 0x1c5e08d0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 9; layer = <CALayer: 0x1c5b9330>> at indexPath #9
2013-08-17 10:59:44.600 SFCCA[22885:907] <UIProgressView: 0x1d8c9aa0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 10; layer = <CALayer: 0x1d8c9480>> at indexPath #10
2013-08-17 10:59:44.607 SFCCA[22885:907] <UIProgressView: 0x1d8cb590; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 11; layer = <CALayer: 0x1d8cb4b0>> at indexPath #11
2013-08-17 10:59:45.160 SFCCA[22885:907] <UIProgressView: 0x1d8b9e20; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 12; layer = <CALayer: 0x1d8a6140>> at indexPath #12
2013-08-17 10:59:45.171 SFCCA[22885:907] <UIProgressView: 0x1d8cc060; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 13; layer = <CALayer: 0x1d8ca870>> at indexPath #13
2013-08-17 10:59:45.813 SFCCA[22885:907] <UIProgressView: 0x1d88dc10; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 14; layer = <CALayer: 0x1d88dc90>> at indexPath #14
2013-08-17 10:59:45.822 SFCCA[22885:907] <UIProgressView: 0x1d8cc9e0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 15; layer = <CALayer: 0x1d872110>> at indexPath #15
2013-08-17 10:59:46.154 SFCCA[22885:907] <UIProgressView: 0x1c5ed300; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 16; layer = <CALayer: 0x1c5ed280>> at indexPath #16
2013-08-17 10:59:46.162 SFCCA[22885:907] <UIProgressView: 0x1c5eeae0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 17; layer = <CALayer: 0x1c5eea00>> at indexPath #17
2013-08-17 10:59:46.652 SFCCA[22885:907] <UIProgressView: 0x1c5ee0f0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 18; layer = <CALayer: 0x1c5e35f0>> at indexPath #18
2013-08-17 10:59:46.660 SFCCA[22885:907] <UIProgressView: 0x1c5efc70; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 19; layer = <CALayer: 0x1c5ee320>> at indexPath #19
2013-08-17 10:59:46.903 SFCCA[22885:907] <UIProgressView: 0x1c5e8b30; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 20; layer = <CALayer: 0x1c5e4aa0>> at indexPath #20
2013-08-17 10:59:46.914 SFCCA[22885:907] <UIProgressView: 0x1c5e8fd0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 21; layer = <CALayer: 0x1c5e7e50>> at indexPath #21
2013-08-17 10:59:48.583 SFCCA[22885:907] <UIProgressView: 0x1d88dc10; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 14; layer = <CALayer: 0x1d88dc90>> at indexPath #14
2013-08-17 10:59:48.590 SFCCA[22885:907] <UIProgressView: 0x1d8cc9e0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 15; layer = <CALayer: 0x1d872110>> at indexPath #15
2013-08-17 10:59:49.118 SFCCA[22885:907] <UIProgressView: 0x1d8b9e20; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 12; layer = <CALayer: 0x1d8a6140>> at indexPath #12
2013-08-17 10:59:49.127 SFCCA[22885:907] <UIProgressView: 0x1d8cc060; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 13; layer = <CALayer: 0x1d8ca870>> at indexPath #13
2013-08-17 10:59:49.730 SFCCA[22885:907] <UIProgressView: 0x1d8c9aa0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 10; layer = <CALayer: 0x1d8c9480>> at indexPath #10
2013-08-17 10:59:49.736 SFCCA[22885:907] <UIProgressView: 0x1d8cb590; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 11; layer = <CALayer: 0x1d8cb4b0>> at indexPath #11
2013-08-17 10:59:50.106 SFCCA[22885:907] <UIProgressView: 0x1d8c3b90; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 8; layer = <CALayer: 0x1d8c3c30>> at indexPath #8
2013-08-17 10:59:50.113 SFCCA[22885:907] <UIProgressView: 0x1c5e08d0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 9; layer = <CALayer: 0x1c5b9330>> at indexPath #9
2013-08-17 10:59:50.643 SFCCA[22885:907] <UIProgressView: 0x1c5d5a10; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 6; layer = <CALayer: 0x1c5b4420>> at indexPath #6
2013-08-17 10:59:50.649 SFCCA[22885:907] <UIProgressView: 0x1c5cd8e0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 7; layer = <CALayer: 0x1c5b68d0>> at indexPath #7
2013-08-17 10:59:50.967 SFCCA[22885:907] <UIProgressView: 0x1c5aa670; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 4; layer = <CALayer: 0x1c5b8d60>> at indexPath #4
2013-08-17 10:59:50.973 SFCCA[22885:907] <UIProgressView: 0x1c5b51d0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 5; layer = <CALayer: 0x1c5b5270>> at indexPath #5
2013-08-17 10:59:51.593 SFCCA[22885:907] <UIProgressView: 0x1c5aa1f0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 2; layer = <CALayer: 0x1c5aa270>> at indexPath #2
2013-08-17 10:59:51.598 SFCCA[22885:907] <UIProgressView: 0x1c5b9860; frame = (20 248; 150 9); opaque = NO; tag = 3; layer = <CALayer: 0x1c5b9a30>> at indexPath #3
2013-08-17 10:59:51.983 SFCCA[22885:907] <UIProgressView: 0x1c5bca00; frame = (20 248; 150 9); hidden = YES; opaque = NO; layer = <CALayer: 0x1c5d1000>> at indexPath #0
2013-08-17 10:59:51.995 SFCCA[22885:907] <UIProgressView: 0x1c59c7c0; frame = (20 248; 150 9); hidden = YES; opaque = NO; tag = 1; layer = <CALayer: 0x1c5bb310>> at indexPath #1
4

3 に答える 3