0

私はカスタムセルでuitableviewを持っています..通常のコードで

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    DDMainCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (cell == nil)
    {
        cell = [[DDMainCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];



    }
}

問題は、1つのセルを選択すると、オンラインでデータをダウンロードするセルにプログレスバーを追加することです。しかし、下にスクロールすると、10個のセルごとに同じプログレスバーがあることがわかります。この動作を防ぐにはどうすればよいですか。

4

3 に答える 3

1

これを試して、

 - (void)viewDidLoad
 {
[super viewDidLoad];
dataarr=[[NSMutableArray alloc]init];
indexarr=[[NSMutableArray alloc]init];
mytableview=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
mytableview.dataSource=self;
mytableview.delegate=self;
[self.view addSubview:mytableview];
for (int i=0; i<30; i++) {
    [dataarr addObject:[NSString stringWithFormat:@"%d",i]];
}
// Do any additional setup after loading the view, typically from a nib.
 }


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
 return [dataarr count];
 }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


static NSString *CellIdentifier = @"Cell";

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
}
cell.textLabel.text=[dataarr objectAtIndex:indexPath.row];
UIActivityIndicatorView *act=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[act setFrame:CGRectMake(50, 20, 20, 20)];
act.hidden=YES;

[cell.contentView addSubview:act];
cell.selectionStyle=UITableViewCellSelectionStyleNone;
if ([indexarr containsObject:[dataarr objectAtIndex:indexPath.row]])
{
    [act startAnimating];

    act.hidden=NO;
    return  cell;

}


return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

 if ([indexarr containsObject:[dataarr objectAtIndex:indexPath.row]])
{
    [mytableview reloadData];

    return;
}
[indexarr addObject:[dataarr objectAtIndex:indexPath.row]];
[mytableview reloadData];

}

ダウンロードが完了したら、indexarr からこのオブジェクトを削除してください。

于 2013-02-19T10:04:28.973 に答える
0

これは、細胞が再利用されているためです。UITableView画面外のセルを再利用可能なセル キューに入れ、reuseIdentifier一致する場合は再利用のためにキューから取り出します。すでにタップされているインデックス/セルを追跡するには、他のデータ構造 (NSArrayまたは など) を使用する必要があります。NSDictionary次に、上記の方法で、セルが初期化されたかデキューされたかに関係なく、基礎となるデータ構造に従って進行状況バーを設定します。

于 2013-02-19T09:56:29.347 に答える
-1

ここであなたの使用UITableViewCellIdentifierreuseIdentifierです。すべてのセルで機能するのは同じタイプです。今、あなたはプログレスバーで一度セルを取っています。これで、すべてのセルデータとは異なります。

したがって、プログレスバーにもう1つのテーブルビューセルを使用するか、テーブルを再ロードするときに、すでに存在するプログレスバーを削除して再度追加します。このため、プログレスバーのタグを使用します。

于 2013-02-19T12:49:27.580 に答える