3

数日間悩まされているiPhoneアプリの問題がありますが、これほど難しいことではないように思われるので、明らかな何かが欠けていると確信しています. 「同様の」トピックに関するフォーラムの議論をたくさん調査しましたが、具体的にこの問題に実際に対処しているものはありません。

明確にするために、私が調査する必要があるドキュメントまたはその他のソースがある場合は、正しい方向に向けてください。

ここに行きます...

テーブル (uitableview) 内でユーザーに表示するアイテムのリストがあります。各項目のセル (uitableviewcell) はカスタムで、2 つの画像ボタン (uibuttons: 緑と赤) が含まれています。予想どおり、テーブル内の各項目について、ユーザーは任意のボタンをクリックできます。ボタンの monitoringRequestType というパラメーターに基づいて、ボタンは別のプロセスを呼び出してサーバーを更新します。状態が「承認済み」の場合、画像はそれぞれ「承認済み」と「却下」に変わります。したがって、赤いボタンをクリックすると、サーバーは状態を「拒否済み」に更新し、画像は「承認済み」と「すでに拒否済み」に変わります。シンプルですね。

だから、ここに問題があります:

拒否ボタンをクリックすると、「承認済み」の画像が「承認済み」の画像の上に表示されます (両方の画像が表示されます)。一方、「承認済み」の画像は正常に機能します。ちゃんと):

CellForRow:
if(indexPath.section==0){
    NSDictionary *dict=[saveJson objectAtIndex:indexPath.row];
    NSString* sMonitoringType = [dict valueForKey:@"monitoringType"];
    UIButton *button1= [[UIButton alloc] initWithFrame:CGRectMake(230,10,40,40)];
    UIButton *button2= [[UIButton alloc] initWithFrame:CGRectMake(280,10,40,40)];
    if([sMonitoringType compare:@"Pending"] == NSOrderedSame){
        [button1 setImage:[UIImage imageNamed:@"approve"]     
                 forState:UIControlStateNormal];
        [button1 addTarget:self
                    action:@selector(greenButtonPressed:withEvent:) 
          forControlEvents:UIControlEventTouchUpInside];
         button1.tag= indexPath.row;   
        [button2 setImage:[UIImage imageNamed:@"reject"]
                 forState:UIControlStateNormal];
        [button2 addTarget:self
                    action:@selector(redButtonPressed:withEvent:) 
          forControlEvents:UIControlEventTouchUpInside];
         button2.tag= indexPath.row;             
    } else if([sMonitoringType compare:@"Approved"] == NSOrderedSame){
        [button1 setImage:[UIImage imageNamed:@"alreadyapproved"] 
                 forState:UIControlStateNormal];
        [button2 setImage:[UIImage imageNamed:@"reject"]
                 forState:UIControlStateNormal];
        [button2 addTarget:self
                    action:@selector(redButtonPressed:withEvent:) 
          forControlEvents:UIControlEventTouchUpInside];
         button2.tag= indexPath.row;
    } else if([sMonitoringType compare:@"Rejected"] == NSOrderedSame){
        [button1 setImage:[UIImage imageNamed:@"approve"] 
                 forState:UIControlStateNormal];
        [button2 setImage:[UIImage imageNamed:@"alreadyrejected"] 
                 forState:UIControlStateNormal];
        [button1 addTarget:self
                    action:@selector(greenButtonPressed:withEvent:) 
          forControlEvents:UIControlEventTouchUpInside];
         button1.tag= indexPath.row;
    }
    [cell addSubview:button1];
    [cell addSubview:button2];
    [button1 release];
    [button2 release];
}
return cell;
}
4

1 に答える 1

0

セルがリロードされるたびに、セルのUIButtonサブビューに が追加されます (セルを再利用していますよね?)。新しいボタンを追加する代わりに、セルのサブビューに既に追加されている古いボタンを再利用し、問題を確認するためにセルの再利用を停止する必要があります (メモリの効率が悪いため、本番コードでは実行しないでください!)。古いボタンを再利用するには、各ボタンに一意のタグを設定し、[cell viewWithTag:uniqueTag]

if(indexPath.section==0){
  NSDictionary *dict=[saveJson objectAtIndex:indexPath.row];
  NSString* sMonitoringType = [dict valueForKey:@"monitoringType"];
  UIButton *button1= [cell viewWithTag:900];
  UIButton *button2= [cell viewWithTag:901];
  if(!button1){// button1 doesn't exist yet (first time)
    button1 = [[UIButton alloc] initWithFrame:CGRectMake(230,10,40,40)];
    [cell addSubview:button1];
  }
  if(!button2){// button2 doesn't exist yet (first time)
    button1 = [[UIButton alloc] initWithFrame:CGRectMake(280,10,40,40)];
    [cell addSubview:button2];
  }
  ......
于 2012-10-08T07:10:38.623 に答える