0

对于UITableViewCellUIButtontableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath方法中创建的每一个。我想UIButton在创建它时检查它是否已经存在,所以它不会被多次添加,但我不能。这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

        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];
    }

        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;
    if (!copyButton.superview) {
        [cell addSubview:copyButton];
    }

    return cell;
}
4

6 回答 6

1

我认为您应该使用cellForRowAtIndexPath将任何子视图添加到单元格的方法,以便在来回滚动时重复使用该单元格,并且在将子视图添加到单元格之前不需要进行任何检查。

于 2013-02-07T13:21:12.113 回答
1
- (UITableViewCell *)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
     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];
    }

    for (UIView *view in [cell subviews]) 
    {
        if ([view isKindOfClass:[UIButton class]]) 
        {
             return cell;
        }
    }

    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;
    if (!copyButton.superview)
    {
        [cell addSubview:copyButton];
    }

    return cell;
}
于 2013-02-07T13:57:26.313 回答
1

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:方法中添加图像,在!cellif 中。这样,我们只添加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;
}
于 2013-02-07T14:32:07.003 回答
0

为了完全避免这种情况,为什么不在UITableViewCell故事板/XIB 中子类化并创建该类的指定表示?这样,当单元被重用时,操作系统不会一次又一次地创建 UI 元素,而是重用已经从 IBOutlets 分配的元素。

于 2013-02-07T13:14:15.487 回答
0
you can check it in this way:
1) put somewhere `copyButton = nil;` (in viewDidLoad, or somewhere else;
2) then:
- (UITableViewCell *)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

        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 (!copyButton) {
        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;
        if (!copyButton.superview) {
           [cell addSubview:copyButton];
        }
     }

    return cell;
}
于 2013-02-07T13:15:15.570 回答
0

试试下面的方法

if ([cell viewWithTag:LBL_TAG])
{
    UIView *vi = (UIView*)[cell viewWithTag:LBL_TAG];
    if ([vi isKindOfClass:[UILabel class]])
    {
        UILabel *lbl = (UILabel*)vi;
        NSLog(@"test  %@..",lbl.text);
    }
}

希望它可以帮助你。

于 2013-02-07T13:20:23.683 回答