1

我目前遇到了 UITableView 的问题,更准确地说是自定义单元格。

我有一个表格视图控制器,比如说 ControllerA,它负责显示不同的 TableViewCell。这些单元格是自定义单元格,在另一个类中定义,比如 ControllerCell。每个单元格都包含其中一个信息按钮(小,带有“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 文件以获取“信息”数据,当单击“信息按钮”时应显示该数据。这不是一个真正的问题,因为我可以获取这些数据并在控制台中显示它。

解析数据后,我会在 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:中,当您不希望显示信息时,您会隐藏它,但对于应该显示的单元格,您没有明确取消隐藏它。

查看该方法中的前两行:您正在 - 正确 - 做的是重用单元格,因此当单元格滚动出视图时,它们会从 UITableView 中删除并放入重用队列中。然后,当单元格应该变得可见时,TableView 会从该队列中获取单元格 - 如果没有可用的单元格,则创建新的单元格。

这一切都很顺利,但过了一会儿,带有隐藏信息按钮的单元格被放入队列中。然后,一段时间后,这些单元格被重用 - 有时用于应该有可见信息的行。

有两种解决方案:您可以显式取消隐藏您希望显示的那些行的信息,或者您可以使用两种不同类型的单元格,一种具有隐藏信息,另一种具有可见信息。然后,您为每个单元格指定一个不同的标识符,并根据单元格所在的行,在出列/创建单元格之前设置标识符。

于 2012-06-27T10:14:48.697 回答