Stavash 的答案是最好的,但如果您不想这样做,也可以使用tableView:cellForRowAtIndexPath:
. 我看到您尝试过,并且在滚动时按钮的状态丢失了。我认为这是由于细胞重用。使用单元重用,一旦表格视图单元离开屏幕,它就会被缓存并带有标识符,然后屏幕上的下一个单元会从缓存中检索具有给定标识符的单元。
为避免按钮在离开屏幕时丢失其状态,您可以使用多个重用标识符并将按钮的状态存储在一个数组中。我们将调用这个属性buttonStates
(它应该是一个可变数组)。
初始化您的buttonStates
变量并添加字符串来表示“基本状态”。添加与表格中单元格数量一样多的这些字符串(我假设只有一个部分基于您的代码)。
当状态发生变化时(这可能会在您的copyPressedFromCell:
方法中发生,请使用表示新状态的字符串更新按钮标记索引处的对象(您已将其设置为单元格的索引)。
完成所有这些后,使您的cellForRowAtIndexPath:
方法如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifier = self.buttonStates[indexPath.row];
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
在我们继续之前,让我们看一下您的一些willDisplayCell:
代码(应该移到这里)。
UIImageView *cellBottomLine = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, CELL_HEIGHT, 320.0, 1)];
cellBottomLine.image = [UIImage imageNamed:@"bottomCellImage.png"];
if (cellBottomLine.subviews) {
[cell addSubview:cellBottomLine];
}
你为什么要运行那个 if 语句?如果你刚刚创建了一个新的图像视图,它YES
每次都会返回(假设子视图数组不是nil
默认的)。您宁愿检查单元格的子视图中是否已经存在底部单元格图像。但我们甚至不需要这样做。只需在cellForRowAtIndexPath:
方法中添加图像,在!cell
if 中。这样,我们只添加bottomCellImage
尚未创建单元格的情况。
您的if (!copyButton.superview)
电话也是如此。继续我们在cellForRowAtIndexPath:
方法中离开的地方:
UIImageView *cellBottomLine = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, CELL_HEIGHT, 320.0, 1)];
cellBottomLine.image = [UIImage imageNamed:@"bottomCellImage.png"];
[cell addSubview:cellBottomLine];
copyButton = [BSFunctions createButtonWithNormalImageNamed:@"copyCellButton.png"
highlightedImageName:@"copyCellButtonPressed.png"
target:self
selector:@selector(copyPressedFromCell:)];
[copyButton setFrame:CGRectMake(250, 10, 62, 32.5)];
copyButton.tag = indexPath.row;
[cell addSubview:copyButton];
}
UIButton *button = [cell viewWithTag:indexPath.row]; // Get the copy button
// Update the state of the button here based on CellIdentifier, outside the if statement so that it gets updated no matter what
// Also configure your cell with any non-button related stuffs here
return cell;
}