我目前在使用UITableView时遇到问题,更准确地说是使用自定义单元格。
我有一个表视图控制器,比方说ControllerA,它负责显示不同的TableViewCells。这些单元格是自定义单元格,在另一个类中定义,比如说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文件以获取“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”按钮开始消失......我不知道为什么。
有人有想法吗? 谢谢: - )
答案 0 :(得分:3)
在tableView:cellForRowAtIndexPath:
中,当您不希望显示信息时隐藏信息,但是对于应该显示信息的单元格,您不会明确取消隐藏信息。
查看该方法中的前两行:你是什么 - 正确 - 做的是重用你的单元格,所以当单元格滚出视图时,它们将从UITableView中删除并放入重用队列。然后,当单元格变得可见时,TableView将从该队列中获取单元格 - 如果没有可用单元格,则创建新单元格。
这一切都很顺利,但过了一会儿,带有隐藏信息按钮的单元格会被放入队列中。然后,一段时间之后,这些单元格被重用 - 有时候对于应该有信息可见的行。
有两种解决方案:您可以显式取消隐藏您希望显示的行的信息,也可以使用两种不同类型的单元格,一种具有隐藏信息,另一种具有可见信息。然后,为每个单元格提供不同的标识符,并根据单元格所在的行,在出列/创建单元格之前设置标识符。