重用表格视图单元格时出现问题?

Posted

技术标签:

【中文标题】重用表格视图单元格时出现问题?【英文标题】:Issue while reusing table view cell? 【发布时间】:2014-07-11 10:58:38 【问题描述】:

在我的UITableView 中,我添加了滑动UISwipeGestureRecognizer 到单元格。所以当我在任何单元格上滑动时,它会在该行上打开一个菜单。但是当我滚动表格视图时,由于单元格可重用性,菜单也会出现在表格下方的其他单元格上。但我只想在被刷过的行上显示菜单用户。 这是我的代码 -

-(StoreCell *)configureCellForIndexPath:(NSIndexPath *)indexPath table:(UITableView *)tablev

    UITableViewCell* cell;

    static NSString *CellIdentifier = @"StoreCell";

    cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    StoreCell* stCell = (StoreCell *)cell;
    stCell.delegate = self;
   //configure my cell here

    UISwipeGestureRecognizer* gestureR = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [gestureR setDirection:UISwipeGestureRecognizerDirectionRight];
    [stCell addGestureRecognizer:gestureR];

    UISwipeGestureRecognizer* gestureL = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipeFrom:)];
    [gestureL setDirection:UISwipeGestureRecognizerDirectionLeft];
    [stCell addGestureRecognizer:gestureL];

    return stCell;
 

那么如何实现所需的行为,使菜单只出现在一行不被重复使用的单元格上。

任何帮助或建议将不胜感激。

【问题讨论】:

存储当前打开菜单的单元格的索引路径,如果正在绘制的单元格不属于该索引路径,则不显示菜单 另外你为什么要创建一个 UITableViewCell,然后在另一行初始化它,然后将它转换为不同的类? 我从其他有更多单元格的地方复制了这段代码,所以我在顶部定义了单元格,然后根据 indexpath 对其进行初始化。 @CW0007007 感谢您的回复,我已按照您的建议实施,但现在滚动后滑动单元格上不显示菜单? 我没有提出建议 【参考方案1】:

您应该将被刷过的单元格保存在一个变量中。在你做了类似的事情之后:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 


if(indexPath.row = self.swipedRow)
   static NSString *CellIdentifier = @"CellSwiped";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) 
    cell = [[[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleSubtitle
             reuseIdentifier:CellIdentifier]
            autorelease];


   cell.textLabel.text=[Array objectAtIndex:indexPath.row];


    return cell;
else
    static NSString *CellIdentifier = @"CellNotSwiped";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) 
    cell = [[[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleSubtitle
             reuseIdentifier:CellIdentifier]
            autorelease];


   cell.textLabel.text=[Array objectAtIndex:indexPath.row];


    return cell;

我没有测试代码,但我想你能理解这个想法;)我希望我能帮忙

【讨论】:

感谢 Ricardo,我通过维护滑动单元格的索引路径解决了这个问题。【参考方案2】: 我不知道你的代码的整个逻辑。不管是什么, 您已在 if 条件下将手势添加到单元格,但缺少 else,因此在重用时会进行复制。 为避免这种情况,您可以在代码的 else 部分中将 nil 设置为单元格的手势识别器,请参阅下文。我只是将您的代码复制并粘贴到 else 部分,唯一的变化是 gesture

-(StoreCell *)configureCellForIndexPath:(NSIndexPath *)indexPath table:(UITableView *)tablev

UITableViewCell* cell;
static NSString *CellIdentifier = @"StoreCell";
if(indexPath.row == 1)

    /* ---- Your Code ---  */

    return stCell;

else

    /* ---- Your Code ---  */

[stCell setGestureRecognizers:nil];
    return stCell;


【讨论】:

以上是关于重用表格视图单元格时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章

在情节提要中自定义表格视图单元格时出现 NSInternalInconsistencyException

为啥在制作自定义表格视图单元格时将可重用单元格出列两次

表格单元格中的集合视图。这是重用的错误

在 Mac 应用程序中重用表格视图单元格

自动布局不适用于可重用的表格视图单元格

与可重用表格单元格不同的转场