まず、私のアプリの大まかな説明は、特定の組織向けの雑誌ライブラリ アプリです。
- ストーリーボードのプロトタイプでカスタマイズされた UICollectionViewCell があります。プロトタイプには、UIImageView、UILabel、UILabel の 3 つのビューがあります。
さらに、
collectionView:cellForItemAtIndexPath:
のインスタンスを作成しました- UIButton (アクション:@selector(downloadButtonTapped:))
そして
- UIProgressView
tag=indexPath.item
とhidden=YES
. _ 次に、セルのindexPath.itemと同じインデックスで、 UIProgressViewを配列 - self.progressViewArrayに追加します。
特定のセルの「ダウンロード」ボタンがタップされて呼び出されるたびに、 cellである送信者のスーパービューのスーパービューのcellとindexPath
downloadButtonTapped:
を取得します。次に、かどうかを確認します。条件が満たされた場合、実行されます。[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