我在表格视图中有一个单元格列表,其中只有最后一个单元格有一个披露指示符(它触发一个动作)。当我向下滚动单元格列表时,一切正常,但如果我奇怪地向上滚动,则披露指示符也出现在其他单元格中。我无法弄清楚问题在哪里,有什么帮助吗?
谢谢, 丹尼尔
这是使用的代码部分:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [myArray objectAtIndex:indexPath.row];
if(([myArray count]-1) == indexPath.row) {
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
答案 0 :(得分:5)
这不是一个错误:它是一个功能;)因为正在重用这些单元格。
如果您的tableview包含200个单元格,并且您的iphone能够同时显示5个单元格,那么您只有5-6个UITableViewCell
个实例。如果你向下滚动一个单元格获取披露按钮,如果你向后滚动单元格正在重复使用,因此披露按钮仍然存在。
解决您的问题:
方法1:不仅在最后一个单元格上设置公开按钮。你也应该在其他单元格中删除/取消它。
方法2:似乎最后一个细胞是语义上的另一种细胞。因此,选择重用标识符,例如:@"MyLastCell
表示最后一个单元格,@"MyCell"
表示所有其他单元格。因此,您的tableview将只重用相同类型的单元格(在您的情况下:有/没有公开按钮)
编辑1:方法2的一些示例伪代码; 编辑3:方法2的更短解决方案
static NSString *CellIdentifier = @"Cell";
static NSString *LastCellIdentifier = @"LastCell";
bool isLastRow = (indexPath.row == numRows-1);
NSString *usedCellIdentifier = isLastRow ? LastCellIdentifier : CellIdentifier;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: usedCellIdentifier];
if(!cell)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:usedCellIdentifier] autorelease];
if(isLastCell)
{
//do disclosure-stuff here. Or add a UIButton here
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton
}
}
编辑2 :方法1的示例代码
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.accessoryType = (idexPath.row == numRows-1) ?
UITableViewCellAccessoryDetailDisclosureButton
: UITableViewCellAccessoryNone ;
答案 1 :(得分:1)
正如托马斯所说,你可以使用他的代码,你可以添加:
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
表示最后一个单元格(在你最后一个单元格出列的地方)和这个:
cell.accessoryType = UITableViewCellAccessoryNone;
用于其他单元格(在您将其他单元格出列的情况下)。
我没有尝试过这段代码,但它应该可以工作......;)
答案 2 :(得分:1)
试试这个
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [myArray objectAtIndex:indexPath.row];
if(([myArray count]-1) == indexPath.row) {
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
else{
cell.accessoryType = UITableViewCellAccessoryNone;
}