1

現在、UITableView、より正確にはカスタムセルに問題があります。

さまざまなTableViewCellの表示を担当するテーブルビューコントローラー、たとえばControllerAを入手しました。これらのセルはカスタムセルであり、別のクラス、たとえばControllerCellで定義されています。各セルには、これらの情報ボタンの1つが含まれています(小さく、「i」が付いた丸い)。これらのボタンは、表示するものがある場合にのみ表示されます。

ControllerCellで、次の内容を定義します。

@property (nonatomic, retain) IBOutlet UIButton *infoButton;
@property (nonatomic, retain) IBOutlet UIAlertView *alert;
@property (nonatomic, retain) IBOutlet NSString *info;
- (IBAction)infoSupButton:(id)sender;

誰もがそうするように、@synthesisと同様に。次に、アラートで何が起こるかを定義します。

- (IBAction)infoSupButton:(id)sender {
        alert = [[UIAlertView alloc] initWithTitle:@"Informations supplémentaires" 
                                                    message:info
                                                   delegate:self 
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
       if (info != nil) {
      [alert show];
      }
}

そして、「initWithStyle」セクションでは、

[_infoButton addTarget:self action:@selector(infoSupButton:) forControlEvents:UIControlEventTouchUpInside];

それはセルの宣言のためでした。

それでは、ControllerAに焦点を当てましょう。

XMLファイルを解析して「info」データを取得しています。このデータは「infoButton」をクリックすると表示されます。このデータを取得してコンソールに表示できるため、これは実際には問題ではありません。

データが解析されたら、viewDidLoadセクションにNSMutableArrayを入力します。

tableInfoSup = [[NSMutableArray alloc] init];

次に、古典的な方法に従います。

-numberOfSectionsInTableView:(3セクション)-numberOfRowsInSection:(セクション0に8行、セクション1に4行、セクション2に4行)-cellForRowAtIndexPath:

3つの異なるセクションがあり、異なる情報を持つセルが表示されています。cellForRowAtIndexメソッドでは、次のようにします。

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

static NSString *cellIdentifier = @"ExerciceTableCell";
ControllerCell *cell = (ControllerCell *)[tableView dequeueReusableCellWithIdentifier:exerciceTableIdentifier];

if (cell == nil) 
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ExerciceTableCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

} 


if (indexPath.section == 0) {
    [...]


    if ([[tableInfoSup objectAtIndex:indexPath.row] isEqualToString:@""]) {
        [cell.infoButton setHidden:YES];
        cell.info = nil;
    }
    else {
        cell.info = [tableInfoSup objectAtIndex:indexPath.row];
    }

}
if (indexPath.section == 1) {
    [...]

    if ([[tableInfoSup objectAtIndex:indexPath.row+8] isEqualToString:@""]) {
        [cell.infoButton setHidden:YES];
        cell.info = nil;
    }
    else {
        cell.info = [tableInfoSup objectAtIndex:indexPath.row+8]; //got the 8 rows from section 0;
    }

}
if (indexPath.section == 2) {

    [...]

    if ([[tableInfoSup objectAtIndex:indexPath.row+12] isEqualToString:@""]) {
        [cell.infoButton setHidden:YES];
        cell.info = nil;
    }
    else {
        cell.info = [tableInfoSup objectAtIndex:indexPath.row+12];  //got the 8 rows from section 0, + 4 rows from section 1
    }    
}


return cell;
}

さて、問題は、画面が初めて表示されたときにすべてが正常に動作していることです。小さな「i」ボタンのあるセルが表示され、良好なUIAlertViewが表示されますが、他のいくつかのセルではボタンが表示されません...それは正常。しかし、数回スクロールすると、「i」ボタンが消え始めます。理由はわかりません。

誰かアイデアはありますか?ありがとう :-)

4

1 に答える 1

3

ではtableView:cellForRowAtIndexPath:、表示したくないときに情報を非表示にしますが、表示する必要のあるセルの情報を明示的に再表示しません。

そのメソッドの最初の2行を見てください。あなたがしていることは-正しく-セルを再利用することです。したがって、セルがスクロールアウトされて表示されなくなると、セルはUITableViewから削除され、再利用キューに入れられます。次に、セルが表示されるようになると、TableViewはそのキューからセルを取得します。使用可能なセルがない場合は、新しいセルを作成します。

これはすべてうまくいきますが、しばらくすると、情報ボタンが非表示になっているセルがキューに入れられます。そして、しばらくして、それらのセルが再利用されます。場合によっては、情報が表示されるはずの行に再利用されます。

これには2つの解決策があります。表示する行の情報を明示的に再表示するか、2種類のセルを使用することができます。1つは非表示の情報、もう1つは表示の情報です。次に、これらの各セルに異なる識別子を付け、セルがどの行にあるかに基づいて、セルをデキュー/作成する前に識別子を設定します。

于 2012-06-27T10:14:48.697 に答える