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

时间:2014-07-11 10:58:39

标签: ios objective-c uitableview

在我的UITableView i' v中添加了滑动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;
} 

那么如何实现所需的行为,以便菜单只出现在一行而不是重用的单元格上。

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

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:0)

  • 我不了解代码的整个逻辑。无论是什么,
  • 您已在 if 条件中添加了手势,但其他缺失,因此在重复使用时会复制。
  • 为了避免这种情况,您可以将 nil 设置为代码的 else 部分中的单元格的手势识别器,请参阅下文。我将您的代码复制并粘贴到 else 部分,唯一的变化是手势

- (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;

}}